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