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 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ý.