Столкнулся с задачей написания триггера для аудита изменений схемы базы данных MSSQL Server 2005.
В мсдн нашел пример
CREATE TRIGGER log
ON DATABASE
FOR DDL_DATABASE_LEVEL_EVENTS
AS
DECLARE @data XML
SET @data = EVENTDATA()
CREATE TRIGGER
INSERT ddl_log
(PostTime, DB_User, Event, TSQL)
VALUES
(GETDATE(),
CONVERT(nvarchar(100), CURRENT_USER),
@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(2000)') ) ;
Все здорово, но только он не отслеживает изменения названия полей и таблиц.
т.е. после изменения типа поля, у меня появляются вот такие записи в таблице:
12.04.2007 13:32:24 dbo CREATE_TABLE CREATE TABLE dbo.Tmp_Table_1 ( key1 uniqueidentifier NULL, asdf4 ntext NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] ;
CREATE TRIGGER data
12.04.2007 13:32:24 dbo DROP_TABLE DROP TABLE dbo.Table_1 ;
Чисто логически, мне кажется, он пропустил операцию
EXEC sp_rename 'Tmp_Table_1','Table_1'
Подскажите пожалуйста, как написать триггер, который бы отлавливал все события, происходящие со структурой базы данных?
Здравствуйте, lppt, Вы писали:
L>Приветствую!
L>Столкнулся с задачей написания триггера для аудита изменений схемы базы данных MSSQL Server 2005.
L>Чисто логически, мне кажется, он пропустил операцию
L>EXEC sp_rename 'Tmp_Table_1','Table_1'
Эта операция — ни есть DDL и поэтому триггер не может ее отловить. Для переименования таблицы sp_rename делает прямой апдэйт системных таблиц.
ЗЫ. Не меняйте структуру таблиц в Management Stidio. Она такие скрипты городит — мама не горюй.
Здравствуйте, pkarklin, Вы писали:
P>Здравствуйте, lppt, Вы писали:
L>>Приветствую!
L>>Столкнулся с задачей написания триггера для аудита изменений схемы базы данных MSSQL Server 2005.
L>>Чисто логически, мне кажется, он пропустил операцию
L>>EXEC sp_rename 'Tmp_Table_1','Table_1'
P>Эта операция — ни есть DDL и поэтому триггер не может ее отловить. Для переименования таблицы sp_rename делает прямой апдэйт системных таблиц.
P>ЗЫ. Не меняйте структуру таблиц в Management Stidio. Она такие скрипты городит — мама не горюй.
Благодарю за ответ, я это подозревал..
у меня теперь встречный вопрос. Можно ли повесить триггер на системные таблицы и как это сделать?
вот такая операция
Create TRIGGER trig on INFORMATION_SCHEMA.COLUMNS
for update,delete,insert
as
...
выдает ошибку
Msg 8197, Level 16, State 4, Procedure trig, Line 2
Object 'INFORMATION_SCHEMA.COLUMNS' does not exist or is invalid for this operation.
Здравствуйте, lppt, Вы писали:
L>Благодарю за ответ, я это подозревал.. L>у меня теперь встречный вопрос. Можно ли повесить триггер на системные таблицы и как это сделать?
L>вот такая операция L>Create TRIGGER trig on INFORMATION_SCHEMA.COLUMNS L>for update,delete,insert L>as L>...
L>выдает ошибку
L>Msg 8197, Level 16, State 4, Procedure trig, Line 2 L>Object 'INFORMATION_SCHEMA.COLUMNS' does not exist or is invalid for this operation.
L>заранее благодарен.
На системные таблицы триггер не повесить. 'INFORMATION_SCHEMA.COLUMNS' — это представление, а не таблица. Представление может иметь только INSTEAD OF триггер. Но на представления схемы INFORMATION_SCHEMA триггер вешать безсмысленно, ибо с ними нет операций изменения данных и они используются только как "просмотрщики" системных таблиц.
Ясно, значит через триггеры видимо не получится отслеживать это все...
А через профайлер это реально?
Насколько я вижу, он может отслеживать практически все события бд. Остается только его грамотно настроить?
Здравствуйте, lppt, Вы писали:
L>Ясно, значит через триггеры видимо не получится отслеживать это все... L>А через профайлер это реально? L>Насколько я вижу, он может отслеживать практически все события бд. Остается только его грамотно настроить?
Теоретически да. При таком подходе трассу придется писать в таблицу и уже потом ее анализировать.