Megosztás a következőn keresztül:


Az EVENTDATA függvény használata

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

A DDL-eseményindítót aktiváló esemény adatait az EVENTDATA függvény rögzíti. Ez a függvény egy xml értéket ad vissza. Az XML-séma az alábbiakra vonatkozó információkat tartalmazza:

  • Az esemény időpontja.

  • A kapcsolat munkamenet-azonosítója (SPID) az eseményindító végrehajtásakor.

  • Az eseményindítót aktiváló esemény típusa.

Az esemény típusától függően a séma további információkat tartalmaz, például azt az adatbázist, amelyben az esemény történt, az objektumot, amelynél az esemény történt, valamint az esemény Transact-SQL utasítását. További információ: DDL triggerek.

A következő DDL-eseményindító például a AdventureWorks2025 mintaadatbázisban jön létre:

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  
;  

Ezután a következő CREATE TABLE utasítás fut:

CREATE TABLE NewTable (Column1 int);

A DDL-eseményindító EVENTDATA() utasítása rögzíti a nem engedélyezett CREATE TABLE utasítás szövegét. Az EVENTDATA által létrehozott xml adatokra vonatkozó XQuery-utasítás segítségével érhetjük el, hogy beolvassuk a <CommandText> elemet. További információ: XQuery Language Reference (SQL Server).

Figyelem

Az EVENTDATA rögzíti CREATE_SCHEMA események adatait, valamint a megfelelő CREATE SCHEMA definíció <schema_element>, ha van ilyen. Az EVENTDATA emellett külön eseményként ismeri fel a <schema_element> definíciót. Ezért egy CREATE_SCHEMA eseményen létrehozott DDL-eseményindító és a CREATE SCHEMA definíciójának <schema_element> által képviselt esemény kétszer is visszaadhatja ugyanazokat az eseményadatokat, például a TSQLCommand adatokat. Vegyük például a CREATE_SCHEMA és CREATE_TABLE eseményeken létrehozott DDL-eseményindítót, és a következő köteg fut:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Ha az alkalmazás lekéri a CREATE_TABLE esemény TSQLCommand adatait, vegye figyelembe, hogy ezek az adatok kétszer is megjelenhetnek: egyszer, amikor a CREATE_SCHEMA esemény bekövetkezik, és ismét, amikor az CREATE_TABLE esemény bekövetkezik. Ne hozzon létre DDL-eseményindítókat a CREATE_SCHEMA eseményeken és a megfelelő CREATE SCHEMA-definíciók <schema_element> szövegén, vagy hozzon létre logikát az alkalmazásba, hogy ugyanazt az eseményt ne dolgozza fel kétszer.

ALTER TABLE és ALTER DATABASE események

A ALTER_TABLE és ALTER_DATABASE események eseményadatai tartalmazzák a DDL utasítás által érintett egyéb objektumok nevét és típusait, valamint az ezeken az objektumokon végrehajtott műveletet is. Az ALTER_TABLE eseményadatok tartalmazzák az ALTER TABLE utasítás által érintett oszlopok, korlátozások vagy triggerek nevét, valamint az érintett objektumokon végrehajtott műveletet (létrehozás, módosítás, elvetés, engedélyezés vagy letiltás). Az ALTER_DATABASE eseményadatok tartalmazzák az ALTER DATABASE utasítás által érintett fájlok vagy fájlcsoportok nevét, valamint az érintett objektumokon végrehajtott műveletet (létrehozás, módosítás vagy elvetés).

Hozza létre például a következő DDL-eseményindítót az AdventureWorks mintaadatbázisban:

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;  

Ezután hajtsa végre a következő ALTER TABLE utasítást, amely megsért egy kényszert:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

A DDL-eseményindító EVENTDATA() utasítása rögzíti a nem engedélyezett ALTER TABLE utasítás szövegét.

Példa

Az EVENTDATA függvénnyel eseménynaplót hozhat létre. Az alábbi példában egy tábla jön létre az eseményinformációk tárolására. Ezután létrejön egy DDL-eseményindító az aktuális adatbázisban, amely feltölti a táblát az alábbi információkkal, amikor bármilyen adatbázisszintű DDL-esemény történik:

  • Az esemény időpontja (a GETDATE függvény használatával).

  • Az adatbázis-felhasználó, akinek a munkamenetében az esemény történt (a CURRENT_USER függvény használatával).

  • Az esemény típusa.

  • Az eseményt alkotó Transact-SQL utasítás.

Az utolsó két elemet ismét xQuery használatával rögzíti a rendszer az EVENTDATA által létrehozott xml- adatokon.

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  

Jegyzet

Az eseményadatok visszaadásához javasoljuk, hogy az XQuery metódust használja a lekérdezés() metódus helyett. A query() metódus a kimenetben XML- és ampersandként kódolt kocsivissza- és újsor (CRLF) példányait adja vissza, míg a érték() metódus láthatatlanná teszi a CRLF példányokat a kimenetben.

A AdventureWorks2025 mintaadatbázishoz hasonló DDL-eseményindító-példa érhető el. A példa beszerzéséhez keresse meg az Adatbázis-eseményindítók mappát az SQL Server Management Studióval. Ez a mappa az AdventureWorks2025 adatbázis Programmability mappájában található. Kattintson a jobb gombbal ddlDatabaseTriggerLog elemre, és válassza szkriptadatbázis-eseményindítót. Alapértelmezés szerint a DDL-eseményindító ddlDatabaseTriggerLog le van tiltva.

Lásd még:

DDL-események
DDL-eseménycsoportok