Определите тип операции, которая вызывает триггер DDL - PullRequest
0 голосов
/ 30 сентября 2018

У меня есть следующая таблица:

CREATE TABLE dbchanges 
(
    ID UNIQUEIDENTIFIER DEFAULT NEWSEQUENTIALID(),
    operationType VARCHAR(16),
    [Date] DATE NOT NULL,
    PRIMARY KEY (ID)
)

Мне нужен мой триггер DDL для регистрации всех изменений, происходящих в базе данных в этой таблице.Можно ли определить тип операции, вызвавшей триггер (CREATE, DROP и т. Д.)?

Я использую Transact-SQL.

1 Ответ

0 голосов
/ 02 октября 2018

Да, это возможно, используя встроенную функцию EVENTDATA().Эта функция возвращает значение XML, которое содержит информацию о событии, которое сработало триггером DDL, например, время события, тип события и т. Д.

Вы можете использовать эту функцию внутри триггера DDL, например, так::

CREATE TRIGGER dbchanges_ddl
ON <database name here>
FOR DDL_TABLE_EVENTS -- alter, create and drop table
AS 

DECLARE @data XML,
        @EventType nvarchar(100);
SET @data = EVENTDATA();

SET @EventType = @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)');

/* 
    Currently, we can examin the content of @EventType to know if 
    the statement that fired the trigger is an alter, create or a drop statement,
    However we have no information about what TABLE is mensioned in that statement.

    To get that information, we need to parse the actual SQL statement.
    We get the statement using TSQLCommand:
*/

DECLARE @Statement nvarchar(4000);
SET @Statement = @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(4000)');

-- Now you can check if the command refers to the table you want to monitor or not,
-- by looking for the name of the table inside the statement.


IF @statement LIKE '%dbchanges%' 
BEGIN
    -- Do whatever you want here...
END

GO
...