Qui modifie mes vues ?
Par Arian Papillon le lundi 5 septembre 2011, 13:43 - Lien permanent
Un développeur indélicat fait des modifications dans le code SQL de mes vues...! Comment mettre en place une surveillance des modifications avec un déclencheur DDL
Le code suivant permet d'enregistrer dans une table les modifications (qui, quand, quoi...) :
-- Crée la table de log
CREATE TABLE [dbo].[ViewsLog](
        [DatabaseLogID] [int] IDENTITY(1,1) NOT NULL,
        [PostTime] [datetime] NOT NULL,
        [DatabaseUser] [sysname] NOT NULL,
        [Event] [sysname] NOT NULL,
        [Schema] [sysname] NULL,
        [Object] [sysname] NULL,
        [TSQL] [nvarchar](max) NOT NULL,
        [XmlEvent] [xml] NOT NULL,
 CONSTRAINT [PK_DatabaseLog_DatabaseLogID] PRIMARY KEY NONCLUSTERED 
(
        [DatabaseLogID] ASC
)) ON [PRIMARY]
GO
-- Crée le déclencheur DDL
CREATE TRIGGER [ddlViewsTriggerLog] 
ON DATABASE 
FOR CREATE_VIEW,ALTER_VIEW,DROP_VIEW 
AS 
BEGIN
    SET NOCOUNT ON
    DECLARE @data XML
    DECLARE @schema sysname
    DECLARE @object sysname
    DECLARE @eventType sysname
    SET @data = EVENTDATA()
    SET @eventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'sysname')
    SET @schema = @data.value('(/EVENT_INSTANCE/SchemaName)[1]', 'sysname')
    SET @object = @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'sysname') 
    IF @object IS NOT NULL
        PRINT '  ' + @eventType + ' - ' + @schema + '.' + @object;
    ELSE
        PRINT '  ' + @eventType + ' - ' + @schema;
    IF @eventType IS NULL
        PRINT CONVERT(nvarchar(max), @data);
    INSERT [dbo].[ViewsLog] 
        (
        [PostTime], 
        [DatabaseUser], 
        [Event], 
        [Schema], 
        [Object], 
        [TSQL], 
        [XmlEvent]
        ) 
    VALUES 
        (
        GETDATE(), 
        CONVERT(sysname, SYSTEM_USER), 
        @eventType, 
        CONVERT(sysname, @schema), 
        CONVERT(sysname, @object), 
        @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'), 
        @data
        );
END
GO