Oui, il y a un moyen
La table pour stocker les résultats du déclencheur
USE [SOME_DATABASE]
GO
CREATE TABLE [dbo].[ddl_objects_log](
[date] [datetime] NULL DEFAULT (getdate()),
[login_name] [nvarchar](128) NULL,
[nt_user_name] [nvarchar](128) NULL,
[program_name] [nvarchar](128) NULL,
[host_name] [nvarchar](128) NULL,
[text] [xml] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
Le déclencheur
USE [SOME_DATABASE]
GO
/****** Object: DdlTrigger [ddl_db_trigger] Script Date: 22/01/2015 13:41:38 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TRIGGER [ddl_db_trigger]
ON DATABASE
FOR CREATE_FUNCTION,
CREATE_PROCEDURE,
CREATE_TABLE,
CREATE_TRIGGER,
CREATE_VIEW,
ALTER_FUNCTION,
ALTER_PROCEDURE,
ALTER_TABLE,
ALTER_TRIGGER,
ALTER_VIEW,
DROP_FUNCTION,
DROP_PROCEDURE,
DROP_TABLE,
DROP_TRIGGER,
DROP_VIEW,
CREATE_INDEX,
ALTER_INDEX,
DROP_INDEX
AS
BEGIN
set nocount ON
insert into ddl_objects_log(login_name, nt_user_name, program_name, host_name, text)
select login_name, nt_user_name, program_name, host_name, EVENTDATA() from sys.dm_exec_sessions WITH(NOLOCK) where session_id=@@SPID
set nocount OFF
END
GO
ENABLE TRIGGER [ddl_db_trigger] ON DATABASE
GO
La requête pour auditer les résultats du déclencheur
USE [SOME_DATABASE]
GO
SELECT top 10
REPLACE(CONVERT(VARCHAR(250), text.query('data(/EVENT_INSTANCE/PostTime)')),'T', ' ') as modify_datetime,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/EventType)')) as event_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ServerName)')) as server_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/DatabaseName)')) as database_name,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectType)')) as object_type,
CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) as object_name,
CONVERT(VARCHAR(215), text.query('data(/EVENT_INSTANCE/UserName)')) as user_name,
Login_name,
CONVERT(VARCHAR(MAX), text.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)')) as command_text
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
where CONVERT(VARCHAR(225), text.query('data(/EVENT_INSTANCE/ObjectName)')) like '%SOME_STORED_PROCEDURE%'
order by date desc
GO
Un autre administrateur de base de données peut avoir une opinion différente, mais je considère que la disponibilité de ces informations est importante pour un administrateur de base de données.
FROM [SOME_DATABASE].[dbo].[ddl_objects_log]
... Dois-je créer la table?Si la trace par défaut est activée et qu'elle n'a pas survolé, vous pouvez l'utiliser pour trouver qui a créé le SP
Cliquer ici pour agrandir
Cela dépend de la raison pour laquelle vous voulez savoir si des objets sont créés / modifiés ou supprimés. Vous pouvez utiliser la notification d'événements pour vous connecter et vous informer si vous pensez que des objets sont créés / déposés ou modifiés par un utilisateur non autorisé. Assurez-vous que les filtres appropriés sont en place.
Pour l'exhaustivité de cette réponse, je veux mentionner - Quelles informations sur les événements puis-je obtenir par défaut de SQL Server? d'Aaron Bertrand.
la source
DATEADD(HH, -24, GETDATE())
si vous souhaitez obtenir des résultats pendant plus de 24 heures.select * from sys.procedures where type = 'P' order by create_date desc
AND DatabaseID= 'the_Database_I_Want
, ça ne me montre rien, même avec desDATEADD(HH, -24, GETDATE())
commentaires. Est-ce que je fais quelque chose de mal?J'arrive tard, mais je "fais" des choses de sécurité et * d'administration.
OUI . Il est important d'avoir ou de créer ces journaux dans la mesure du possible. Cependant, il est également de votre responsabilité, à mon avis, de ne pas "ouvrir cette boîte" jusqu'à ce qu'elle devienne importante. En d'autres termes - encore une fois, à mon avis - c'est votre travail de fournir le référentiel pour les données, assurez-vous qu'il est sécurisé, assurez-vous qu'il est réglé ... puis restez à l'écart des données à l'intérieur, sauf si vous êtes appelé spécifiquement regardez-le ou à moins qu'il ne soit nécessaire pour atteindre votre objectif.
Mon opinion et mon point de vue, mais je traite des données sensibles et confidentielles depuis de nombreuses années et je me suis fait un devoir de ne presque jamais «ouvrir la boîte», car cela dégrade la confiance des utilisateurs.
Permettez-moi maintenant de prendre un chemin différent : que se passe-t-il si personne ne peut rapidement comprendre comment la procédure répond aux cas marginaux? Ce qui pourrait vous prendre, moi ou moi, une heure à réfléchir peut prendre quelques minutes à l'auteur: "ah, c'est vrai, cette chose échoue quand ..."
la source