Použití funkce EVENTDATA

platí pro:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL databáze v Microsoft Fabric

Informace o události, která aktivuje trigger DDL, se zaznamenávají pomocí funkce EVENTDATA. Tato funkce vrátí hodnotu XML . Schéma XML obsahuje informace o následujících informacích:

  • Čas události.

  • ID relace (SPID) připojení při spuštění triggeru.

  • Typ události, která aktivovala trigger

V závislosti na typu události schéma pak obsahuje další informace, jako je databáze, ve které došlo k události, objekt, proti kterému došlo k události, a Transact-SQL příkaz události. Další informace najdete v tématu Triggery DDL.

V ukázkové databázi se například vytvoří AdventureWorks2025 následující trigger DDL:

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  
;  

Pak se spustí následující CREATE TABLE příkaz:

CREATE TABLE NewTable (Column1 int);

Příkaz EVENTDATA() v triggeru DDL zachycuje text CREATE TABLE příkazu, který není povolený. Toho dosáhnete pomocí příkazu XQuery proti datům XML vygenerovaným eventDATA a načtením elementu <CommandText> . Další informace naleznete v tématu XQuery Language Reference (SQL Server).

Upozornění

EVENTDATA zachycuje data CREATE_SCHEMA událostí i <schema_element> odpovídající CREATE SCHEMA definice, pokud nějaká existuje. EventDATA navíc rozpozná definici <schema_element> jako samostatnou událost. Proto může DDL spouštěč vytvořený jak na CREATE_SCHEMA události, tak na události reprezentované <schema_element> definice CREATE SCHEMA , vrátit stejné údaje o události dvakrát, například samotná TSQLCommand data. Představte si například trigger DDL, který se vytvoří v událostech CREATE_SCHEMA i CREATE_TABLE a spustí se následující dávka:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Pokud aplikace načte TSQLCommand data události CREATE_TABLE, mějte na paměti, že tato data se mohou objevit dvakrát: jednou, když dojde k CREATE_SCHEMA události, a znovu, když dojde k události CREATE_TABLE. Vyhněte se vytváření DDL spouštěčů jak u CREATE_SCHEMA událostí, tak u <schema_element> textů odpovídajících CREATE SCHEMA definic, nebo do aplikace zabudujte logiku, aby stejná událost nebyla zpracovávána dvakrát.

ALTER TABLE a ALTER DATABASE Akce

Data události pro události ALTER_TABLE a ALTER_DATABASE události zahrnují také názvy a typy jiných objektů ovlivněných příkazem DDL a akci provedenou s těmito objekty. Data událostí ALTER_TABLE zahrnují názvy sloupců, omezení nebo spouštěčů ovlivněných příkazem ALTER TABLE a akcí (vytvářet, upravovat, zrušovat, povolit nebo zakázat) prováděnou na postižených objektech. Data událostí ALTER_DATABASE zahrnují názvy všech souborů nebo skupin souborů ovlivněných příkazem ALTER DATABASE a akci (vytvoření, úprava nebo odstranění) provedenou na postižených objektech.

Vytvořte například následující trigger DDL v ukázkové databázi 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;  

Poté proveďte následující ALTER TABLE příkaz, který porušuje omezení:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

Příkaz EVENTDATA() v triggeru DDL zachycuje text ALTER TABLE příkazu, který není povolený.

Příklad

Pomocí funkce EVENTDATA můžete vytvořit protokol událostí. V následujícím příkladu se vytvoří tabulka pro ukládání informací o událostech. Trigger DDL se pak vytvoří v aktuální databázi, která naplní tabulku následujícími informacemi při každé události DDL na úrovni databáze:

  • Čas události (pomocí funkce GETDATE)

  • Uživatel databáze, proti kterému došlo k události (pomocí funkce CURRENT_USER).

  • Typ události.

  • Příkaz Transact-SQL, který se skládá z události.

Znovu se zachytí poslední dvě položky pomocí XQuery proti datům XML generovaným službou EVENTDATA.

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  

Poznámka:

Pokud chcete vrátit data událostí, doporučujeme místo metody query() použít metodu XQuery value(). Metoda query() vrátí ve výstupu instance návratu na začátek řádku a uvozovky (CRLF) xml a ampersand-escaped, zatímco metoda value() vykresluje instance CRLF neviditelné ve výstupu.

Příklad podobného triggeru DDL je k dispozici s ukázkovou AdventureWorks2025 databází. Pokud chcete získat příklad, vyhledejte složku Triggers databáze pomocí aplikace SQL Server Management Studio. Tato složka se nachází ve složce Programovatelnost v databázi AdventureWorks2025. Klikněte pravým tlačítkem na ddlDatabaseTriggerLog a vyberte trigger databáze skriptu jako. Ve výchozím nastavení je trigger DDL ddlDatabaseTriggerLog zakázaný.