MSSQL - Триггер для аудита.
От: lppt  
Дата: 12.04.07 11:10
Оценка:
Приветствую!

Столкнулся с задачей написания триггера для аудита изменений схемы базы данных 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'

Подскажите пожалуйста, как написать триггер, который бы отлавливал все события, происходящие со структурой базы данных?

Заранее благодарен.
Re: MSSQL - Триггер для аудита.
От: pkarklin  
Дата: 13.04.07 08:05
Оценка: 2 (1)
Здравствуйте, lppt, Вы писали:

L>Приветствую!


L>Столкнулся с задачей написания триггера для аудита изменений схемы базы данных MSSQL Server 2005.


L>Чисто логически, мне кажется, он пропустил операцию


L>EXEC sp_rename 'Tmp_Table_1','Table_1'


Эта операция — ни есть DDL и поэтому триггер не может ее отловить. Для переименования таблицы sp_rename делает прямой апдэйт системных таблиц.

ЗЫ. Не меняйте структуру таблиц в Management Stidio. Она такие скрипты городит — мама не горюй.
Re[2]: MSSQL - Триггер для аудита.
От: lppt  
Дата: 16.04.07 07:13
Оценка:
Здравствуйте, 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.

заранее благодарен.
Re[3]: MSSQL - Триггер для аудита.
От: pkarklin  
Дата: 16.04.07 07:39
Оценка: 3 (1)
Здравствуйте, 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 триггер вешать безсмысленно, ибо с ними нет операций изменения данных и они используются только как "просмотрщики" системных таблиц.
Re[4]: MSSQL - Триггер для аудита.
От: lppt  
Дата: 16.04.07 09:37
Оценка:
Ясно, значит через триггеры видимо не получится отслеживать это все...
А через профайлер это реально?
Насколько я вижу, он может отслеживать практически все события бд. Остается только его грамотно настроить?
Re[5]: MSSQL - Триггер для аудита.
От: pkarklin  
Дата: 16.04.07 09:57
Оценка:
Здравствуйте, lppt, Вы писали:

L>Ясно, значит через триггеры видимо не получится отслеживать это все...

L>А через профайлер это реально?
L>Насколько я вижу, он может отслеживать практически все события бд. Остается только его грамотно настроить?


Теоретически да. При таком подходе трассу придется писать в таблицу и уже потом ее анализировать.
Re[2]: MSSQL - Триггер для аудита.
От: _d_m_  
Дата: 25.04.07 08:49
Оценка:
Здравствуйте, pkarklin, Вы писали:

P>ЗЫ. Не меняйте структуру таблиц в Management Stidio. Она такие скрипты городит — мама не горюй.


Нормальные скрипты. Конечно, не идеальные, но работают. Ими и живем.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.