Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
platí pro:SQL Server
Azure SQL Database
Azure SQL Managed Instance
SQL 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ý.