Sdílet prostřednictvím


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 zaznamenává data CREATE_SCHEMA událostí a <také schema_element> odpovídající definice CREATE SCHEMA, pokud existuje. EventDATA navíc rozpozná definici <schema_element> jako samostatnou událost. Proto trigger DDL vytvořený pro CREATE_SCHEMA událost a událost reprezentovaná <schema_element> definice CREATE SCHEMA může vrátit stejná data události dvakrát, například 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í triggerů DDL na CREATE_SCHEMA událostech i <schema_element> textech odpovídajících definic CREATE SCHEMA, nebo do aplikace zabudujte logiku, aby se stejná událost nezpracovala dvakrát.

ALTER TABLE a ALTER DATABASE – události

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álosti ALTER_TABLE zahrnují názvy sloupců, omezení nebo triggerů ovlivněných příkazem ALTER TABLE a akce (vytvoření, změna, přetažení, povolení nebo zakázání) provedených u ovlivněných objektů. Data událostí ALTER_DATABASE obsahují názvy všech souborů nebo skupin souborů ovlivněných příkazem ALTER DATABASE a akce (vytvoření, změna nebo odstranění) provedených u ovlivněných objektů.

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;  

Pak spusťte následující příkaz ALTER TABLE, 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ý.

Viz také

Události DDL
Skupiny událostí DDL