Udostępnij za pośrednictwem


EVENTDATA (Transact-SQL)

Dotyczy:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Ta funkcja zwraca informacje o zdarzeniach serwera lub bazy danych. Gdy zostanie wyzwolone powiadomienie o zdarzeniu, a określony broker usługi otrzyma wyniki, EVENTDATA jest wywoływany. Wyzwalacz DDL lub logowania również obsługuje wewnętrzne użycie EVENTDATA.

Transact-SQL konwencje składni

Składnia

EVENTDATA( )

Uwagi

EVENTDATA Zwraca dane tylko wtedy, gdy odwołuje się bezpośrednio wewnątrz wyzwalacza DDL lub logowania. EVENTDATA Zwraca wartość null, jeśli wywołują ją inne procedury, nawet jeśli wyzwalacz DDL lub logowania wywołuje te procedury.

Dane zwrócone przez usługę EVENTDATA są nieprawidłowe po transakcji, która

  • nazwana EVENTDATA jawnie
  • wywoływana EVENTDATA niejawnie
  • zatwierdzenia
  • jest wycofany

Ostrożność

EVENTDATA Zwraca dane XML wysyłane do klienta jako Unicode, który używa 2 bajtów dla każdego znaku. EVENTDATA zwraca kod XML, który może reprezentować następujące punkty kodu Unicode:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

Kod XML nie może wyrazić i nie zezwoli na niektóre znaki, które mogą być wyświetlane w identyfikatorach i danych Transact-SQL. Znaki lub dane, które mają punkty kodu, które nie są wyświetlane na poprzedniej liście, są mapowane na znak zapytania (?).

Hasła nie są wyświetlane podczas CREATE LOGIN wykonywania instrukcji lub ALTER LOGIN . Chroni to zabezpieczenia logowania.

Zwrócone schematy

Funkcja EVENTDATA zwraca wartość xml typu danych. Domyślnie definicja schematu dla wszystkich zdarzeń jest instalowana w tym katalogu: <drive>:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Strona sieci Web Schematy XML programu Microsoft SQL Server zawiera również schemat zdarzeń.

Aby wyodrębnić schemat dla dowolnego określonego zdarzenia, wyszukaj schemat typu złożonego EVENT_INSTANCE_<event_type>. Aby na przykład wyodrębnić schemat DROP_TABLE zdarzenia, wyszukaj schemat .EVENT_INSTANCE_DROP_TABLE

Przykłady

Odp. Wykonywanie zapytań dotyczących danych zdarzeń w wyzwalaczu DDL

W tym przykładzie tworzony jest wyzwalacz DDL, który uniemożliwia tworzenie nowych tabel bazy danych. Użycie zapytania XQuery względem danych XML generowanych przez EVENTDATA przechwycenie instrukcji Transact-SQL wyzwalacza. Aby uzyskać więcej informacji, zobacz XQuery Language Reference (SQL Server).

Uwaga

W przypadku używania funkcji Wyniki do siatki w programie SQL Server Management Studio w celu wykonania zapytania <TSQLCommand> względem elementu podziały wierszy w tekście polecenia nie są wyświetlane. Zamiast tego użyj wyników do tekstu .

USE AdventureWorks2022;  
GO  
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  
;  
GO  
--Test the trigger.  
CREATE TABLE NewTable (Column1 INT);  
GO  
--Drop the trigger.  
DROP TRIGGER safety  
ON DATABASE;  
GO  

Uwaga

Aby zwrócić dane zdarzenia, użyj metody XQuery value() zamiast metody query(). Metoda query() zwraca wystąpienia powrotu karetki XML i ampersand-escaped (CR/LF) w danych wyjściowych, podczas gdy metoda value() renderuje wystąpienia CR/LF niewidoczne w danych wyjściowych.

B. Tworzenie tabeli dzienników z danymi zdarzeń w wyzwalaczu DDL

W tym przykładzie utworzono tabelę do przechowywania informacji o wszystkich zdarzeniach na poziomie bazy danych i wypełniliśmy tę tabelę wyzwalaczem DDL. Użycie zapytania XQuery względem danych XML generowanych przez EVENTDATA przechwycenie typu zdarzenia i instrukcji Transact-SQL.

USE AdventureWorks2022;  
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  
--Drop the trigger.  
DROP TRIGGER log  
ON DATABASE;  
GO  
--Drop table ddl_log.  
DROP TABLE ddl_log;  
GO  

Zobacz też

Korzystanie z funkcji EVENTDATA
wyzwalacze DDL
Powiadomienia o zdarzeniach
Wyzwalacze logowania