Funkcja EVENTDATA

Informacje o zdarzeniu fires wyzwalacza DDL zostanie przechwycone za pomocą EVENTDATA funkcja.Ta funkcja zwraca xml wartości.Schemat XML zawiera następujące informacje:

  • czas zdarzenie.

  • System proces ID (SPID) połączenia podczas wykonywania wyzwalacza.

  • Typ zdarzenie, które są opalane wyzwalacza.

W zależności od typu zdarzenia schematu następnie zawiera dodatkowe informacje, takie jak bazy danych w którym wystąpiło zdarzenie obiektu, przeciwko którym wystąpiło zdarzenie, a Transact-SQL instrukcja zdarzeń.Aby uzyskać więcej informacji, zobacz EVENTDATA (Transact-SQL).

Na przykład, następujący wyzwalacz DLL jest tworzony w AdventureWorks2008R2 przykładowej bazy danych:

CREATE TRIGGER safety 
ON DATABASE 
FOR CREATE_TABLE 
AS 
    PRINT 'CREATE TABLE Issued.'
    SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
   RAISERROR ('New tables cannot be created in this database.', 16, 1) 
   ROLLBACK
;

Następujące CREATE TABLE Uruchom instrukcja:

    CREATE TABLE NewTable (Column1 int);

EVENTDATA() instrukcja w wyzwalacz DLL przechwytuje tekst CREATE TABLE instrukcja, która nie jest dozwolona.Jest to osiągane przy użyciu instrukcja XQuery przeciwko xml danych, który jest generowany przez EVENTDATA i pobierania <CommandText> elementu.Aby uzyskać więcej informacji, zobacz Skorowidz języka XQuery (aparat bazy danych).

PrzestrogaPrzestroga

EVENTDATA przechwytuje dane zdarzenia CREATE_SCHEMA, jak również <schema_element> odpowiednich definicji tworzenie SCHEMATU, jeśli istnieje dowolny.Ponadto rozpoznaje EVENTDATA <schema_element> definicji jako osobne zdarzenie.Dlatego wyzwalacz DLL utworzony na zdarzenia CREATE_SCHEMA i zdarzeń, reprezentowane przez <schema_element> Tworzenie schematu definicji, może zwracać dane zdarzenie dwukrotnie, takich jak TSQLCommand danych.Rozważmy na przykład wyzwalacz DLL, utworzonego na zdarzenia CREATE_SCHEMA i CREATE_TABLE i następujących partia uruchomienia:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Jeśli aplikacja pobiera TSQLCommand danych zdarzenie CREATE_TABLE, należy pamiętać, że dane te mogą być wyświetlane dwa razy: raz podczas CREATE_SCHEMA zdarzenie i ponownie po wystąpieniu zdarzenie CREATE_TABLE.Należy unikać tworzenia wyzwalaczy DDL zdarzenie CREATE_SCHEMA i <schema_element> Teksty wszelkie odpowiednie definicje tworzenie SCHEMATU lub wbudowanie logiki do aplikacji, tak aby nie przetworzone dwa razy tego samego zdarzenie.

Zmienianie tabeli i zdarzenia zmiany bazy danych

Dane zdarzenie dla zdarzenie ALTER_TABLE i ALTER_DATABASE także nazw i typów obiektów innych instrukcja DDL i akcja wykonanych na tych obiektów.Nazwy kolumn, ograniczenia lub wyzwalaczy dotyczy instrukcja ALTER TABLE zawiera dane zdarzenie ALTER_TABLE i akcja (tworzyć, zmieniać, drop, włączanie lub wyłączanie) wykonywane dotyczy obiektów.ALTER_DATABASE zdarzenie danych zawiera nazwy plików lub aplikacjami dotyczy instrukcja ALTER DATABASE i działań (Tworzenie, zmieniające lub usuwające) wykonywane obiektów podlegających usterce.

Na przykład można utworzyć następujące wyzwalacz DLL w bazie danych AdventureWorks:

CREATE TRIGGER ColumnChanges
ON DATABASE 
FOR ALTER_TABLE
AS
-- Detect whether a column was created/altered/dropped.
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]', 'nvarchar(max)')
RAISERROR ('Table schema cannot be modified in this database.', 16, 1);
ROLLBACK;

Następnie wykonać następujące ALTER TABLE instrukcja , naruszające ograniczenia:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date; 

Instrukcja EVENTDATA() w wyzwalacz DLL przechwytuje tekst ALTER TABLE instrukcji, która nie jest dozwolona.

Przykład

Aby utworzyć dziennik zdarzeń, można użyć funkcja EVENTDATA.W poniższym przykładzie tworzona jest tabela do przechowywania zdarzenie informacji.wyzwalacz DLL zostanie utworzona w bieżącej bazie danych zapełnia tabela następujące informacje w każdym przypadku, gdy wystąpi zdarzenie DDL dowolny poziom bazy danych:

  • Czas zdarzenie (funkcja GETDATE).

  • Użytkownik bazy danych, wobec którego sesja zdarzenie wystąpił (za pomocą funkcja CURRENT_USER).

  • Typ zdarzenie.

  • Transact-SQL instrukcja, która składa zdarzenie.

Ponownie, ostatnie dwa elementy są przechwytywane przy użyciu XQuery przeciwko xml danych, która jest generowana przez EVENTDATA.

USE AdventureWorks2008R2;
GO
CREATE TABLE ddl_log (PostTime datetime, DB_User nvarchar(100), Event nvarchar(100), TSQL nvarchar(2000));
GO
CREATE TRIGGER log 
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS
DECLARE @data XML
SET @data = EVENTDATA()
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)') ) ;
GO
--Test the trigger
CREATE TABLE TestTable (a int)
DROP TABLE TestTable ;
GO
SELECT * FROM ddl_log ;
GO

Ostrzeżenie

Aby zwrócić dane zdarzenie, zaleca się używać XQuery value() metoda zamiast query() metoda.query() Metoda zwraca XML i wyjściowym znak powrotu karetki i wysuwu wiersza (CRLF) wystąpień w wynikach podczas value() metody renderuje wystąpień CRLF niewidoczne w danych wyjściowych.

Podobny przykład wyzwalacz DLL jest dostarczany z AdventureWorks2008R2 przykładowej bazy danych.Aby uzyskać przykład, zlokalizuj folder wyzwalaczy bazy danych za pomocą SQL Server Management Studio.Ten folder znajduje się w programowania folder AdventureWorks bazy danych.Kliknij prawym przyciskiem myszy ddlDatabseTriggerLog i wybierz Skrypt bazy danych wyzwalacz jako.Domyślnie wyzwalacz DLL ddlDatabseTriggerLog jest wyłączona.

Zobacz także

Koncepcje