Существует ли один тип события для триггера ddl, который отслеживает все события удаления в базе данных (t-sql)? - PullRequest
0 голосов
/ 20 октября 2018

Я хочу, чтобы мой триггер регистрировал все события отбрасывания, происходящие в моей базе данных.

CREATE TRIGGER [log]
ON DATABASE
FOR DROP_TABLE, DROP_FUNCTION, DROP_TRIGGER, ...
AS ...

Могу ли я просто заменить все события отбрасывания одним общим для отбрасывания?

CREATE TRIGGER [log]
ON DATABASE
FOR DROP_FOR_ALL_DATABASE_OBJECTS
AS ...

1 Ответ

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

Вам нужно использовать DDL_DATABASE_LEVEL_EVENTS.С помощью этого event вы можете регистрировать все события.

evendata() Функция включает в себя всю информацию, которую вам нужно регистрировать.Например, тип события, имя объекта и так далее.Обратите внимание, что eventdata() возвращает XML.

create trigger [log]
on database
for DDL_DATABASE_LEVEL_EVENTS
as
begin

    declare
        @eventType  as sysname;

    select
        @eventType  = eventdata().value('(/EVENT_INSTANCE/EventType)[1]', 'SYSNAME');

    if @eventType like '%drop%'
        ...

end;

ОБНОВЛЕНИЕ:

eventdate() Пример XML-результата:

<EVENT_INSTANCE>
  <EventType>**</EventType>
  <PostTime>**</PostTime>
  <SPID>**</SPID>
  <ServerName>**</ServerName>
  <LoginName>**</LoginName>
  <UserName>**</UserName>
  <DatabaseName>**</DatabaseName>
  <SchemaName />
  <ObjectName>**</ObjectName>
  <ObjectType>**</ObjectType>
  <TargetObjectName />
  <TargetObjectType>**</TargetObjectType>
  <TSQLCommand>
    <SetOptions ANSI_NULLS="ON" ANSI_NULL_DEFAULT="ON" ANSI_PADDING="ON" QUOTED_IDENTIFIER="ON" ENCRYPTED="FALSE" />
    <CommandText>
        ...
    </CommandText>
  </TSQLCommand>
</EVENT_INSTANCE>
...