Using the EVENTDATA Function
Za pomocą funkcja EVENTDATA przechwytywania informacji o uruchomieniu wyzwalacz DLL na zdarzenie.Ta funkcja zwraca xml wartość. Schemat XML zawiera następujące informacje:
Godzina wystąpienia zdarzenie.
Identyfikator systemu Process ID (SPID) połączenia podczas wykonywania wyzwalacza.
Typ uruchomienia wyzwalacza zdarzenie.
W zależności od typu zdarzenia schematu to zawiera dodatkowe informacje, takie jak bazy danych w którym wystąpiło zdarzenie, obiektu, na którym wystąpiło zdarzenie, a także Transact-SQL instrukcja zdarzenia. Aby uzyskać więcej informacji zobaczEVENTDATA (Transact-SQL).
Na przykład, następujące wyzwalacz DLL jest tworzony w AdventureWorks Przykładowa baza 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
;
Poniżej CREATE TABLE Uruchom instrukcja:
CREATE TABLE NewTable (Column1 int);
The EVENTDATA() instrukcja in the wyzwalacz DLL captures the text of the CREATE TABLE instrukcja that is not allowed. Można to osiągnąć, używając instrukcja XQuery przed xml dane, które są generowane przez EVENTDATA i pobierania <CommandText> element. Aby uzyskać więcej informacji zobaczXQuery Language Reference (aparat bazy danych).
Ostrzeżenie
EVENTDATA przechwytuje dane CREATE_SCHEMA zdarzenia, jak również <schema_element> CREATE schemat odpowiednich definicji, jeśli istnieje. Ponadto rozpoznaje EVENTDATA <schema_element> Definicja jako osobne zdarzenie. Dlatego DDL wyzwalacz utworzony na obu zdarzeń CREATE_SCHEMA i zdarzenia są reprezentowane przez <schema_element> CREATE schematu definicji, może zwrócić te same dane zdarzenie dwa razy, takich jak TSQLCommand dane. Rozważmy na przykład wyzwalacz DLL, który jest tworzony na zdarzenia CREATE_SCHEMA i CREATE_TABLE i uruchomieniu następujących zadań wsadowych:
CREATE SCHEMA s
CREATE TABLE t1 (col1 int)
Jeśli aplikacja pobiera TSQLCommand Dane zdarzenie CREATE_TABLE należy pamiętać, że dane te mogą być wyświetlane dwa razy: raz podczas CREATE_SCHEMA wystąpi zdarzenie, a następnie po wystąpieniu zdarzenia CREATE_TABLE. Należy unikać tworzenia wyzwalaczy DDL zdarzenie CREATE_SCHEMA oraz <schema_element> teksty wszelkich odpowiednie definicje CREATE SCHEMA lub tworzenia logiki do aplikacji, dzięki czemu tego samego zdarzenie nie jest wykonywane dwa razy.
ALTER tabela i zdarzenia ALTER DATABASE
Dane zdarzenie dla zdarzenie ALTER_TABLE i ALTER_DATABASE obejmuje również nazwy i innych obiektów wpływa w instrukcja DDL oraz akcja na tych obiektów.Dane opisujące zdarzenie ALTER_TABLE znajdują się nazwy kolumn, ograniczeń lub wyzwalaczy dotyczy instrukcja ALTER tabela i akcja (tworzyć, zmieniać, upuść, włączyć lub wyłączyć) wykonana na obiekty, których dotyczy problem.Dane opisujące zdarzenie ALTER_DATABASE znajdują się nazwy plików lub filegroups dotyczy instrukcja ALTER DATABASE i działań (Tworzenie, zmienianie lub upuść) wykonana na obiekty, których dotyczy problem.
Na przykład utworzyć następującą wyzwalacz DLL przykładowej bazy 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ącą instrukcję instrukcja ALTER tabela naruszający ograniczenie:
ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;
Instrukcja EVENTDATA() w DDL wyzwalacza przechwytywania tekst ALTER TABLE Instrukcja nie jest dozwolona.
Przykład
Funkcja EVENTDATA służy do tworzenia dziennika zdarzeń.W następującym przykładzie utworzono tabela do przechowywania informacji o zdarzeniu.wyzwalacz DLL zostanie utworzona w bieżącej bazie danych za każdym razem, gdy wystąpi zdarzenie DDL dowolnego poziom bazy danych są wstawiane w tabela, z następującymi informacjami:
Czas zdarzenie (funkcja GETDATE).
Użytkownik bazy danych, względem którego sesja zdarzenie wystąpiło (przy użyciu funkcja CURRENT_USER).
Typ zdarzenie.
The Transact-SQL instrukcja that comprised the zdarzenie.
Ponownie, ostatnie dwa elementy są przechwytywane przy użyciu XQuery przed xml dane, które są generowane przez EVENTDATA.
USE AdventureWorks;
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
Uwaga
Aby zwrócić dane zdarzenie, zaleca się użycie XQuery value() Metoda zamiast query() Metoda. The query() metoda returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() metoda renders CRLF instances invisible in the output.
Podobne przykład wyzwalacz DLL jest dostarczany z AdventureWorks Przykładowa baza danych. Aby uzyskać w przykładzie, zlokalizuj folder wyzwalaczy bazy danych przy użyciu SQL Server Management Studio. Ten folder znajduje się w obszarze Programowania folder AdventureWorks bazy danych.Kliknij prawym przyciskiem myszy ddlDatabseTriggerLog i wybierz opcję Skrypt bazy danych wyzwalacz jako.Domyślnie, wyzwalacz DLL ddlDatabseTriggerLog jest wyłączona.