Триггеры SQL Server DDL можно использовать для отслеживания изменений DDL, независимо от того, были ли они преднамеренными или случайными. Кто совершил изменение, когда и на что повлияло совершенное действие — это основная информация, которую необходимо получить с помощью триггеров. Для использования этого решения необходимо создать и поддерживать как триггеры, так и хранилище перехваченной информации.
В следующем примере информация о событии, вызвавшем срабатывание триггера, собирается с помощью функции EVENTDATA() SQL Server. Сценарий SQL создает триггер DDL, который фиксирует события CREATE, ALTER и DROP на уровне базы данных (хотя триггеры могут быть созданы на уровне сервера для захвата событий для всех баз данных на сервере; вместо параметра ON ALL SERVER следует использовать параметр ON ALL SERVER). В БАЗЕ):
CREATE TRIGGER Audit_DDL
ON DATABASE
FOR CREATE_TABLE, ALTER_TABLE, DROP_TABLE
AS
DECLARE
@event xml;
SET
@event = EVENTDATA();
INSERT INTO Audit_DDL_Events
VALUES
(
REPLACE(CONVERT(varchar(50),
@event.query('data(/EVENT_INSTANCE/PostTime)')), 'T', ' ')
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/LoginName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/UserName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/DatabaseName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/SchemaName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/ObjectName)'))
,
CONVERT(varchar(150),
@event.query('data(/EVENT_INSTANCE/ObjectType)'))
,
CONVERT(varchar(max),
@event.query('data(/EVENT_INSTANCE/TSQLCommand/CommandText)'))
);
Также необходимо создать соответствующую таблицу хранения для данных аудита из EVENTDATA XML:
CREATE TABLE Audit_DDL_Events
(
DDL_Event_Time datetime
,
DDL_Login_Name varchar(150)
,
DDL_User_Name varchar(150)
,
DDL_Database_Name varchar(150)
,
DDL_Schema_Name varchar(150)
,
DDL_Object_Name varchar(150)
,
DDL_Object_Type varchar(150)
,
DDL_Command varchar(max)
);
person
Ivan Stankovic
schedule
28.02.2014