De functie EVENTDATA gebruiken

van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceSQL-database in Microsoft Fabric

Informatie over een gebeurtenis die een DDL-trigger activeert, wordt vastgelegd met behulp van de functie EVENTDATA. Met deze functie wordt een xml--waarde geretourneerd. Het XML-schema bevat informatie over het volgende:

  • De tijd van de gebeurtenis.

  • De sessie-id (SPID) van de verbinding wanneer de trigger wordt uitgevoerd.

  • Het type gebeurtenis dat de trigger heeft geactiveerd.

Afhankelijk van het gebeurtenistype bevat het schema vervolgens aanvullende informatie, zoals de database waarin de gebeurtenis heeft plaatsgevonden, het object waarop de gebeurtenis heeft plaatsgevonden en de Transact-SQL instructie van de gebeurtenis. Zie DDL-triggersvoor meer informatie.

De volgende DDL-trigger wordt bijvoorbeeld gemaakt in de AdventureWorks2025 voorbeelddatabase:

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  
;  

De volgende CREATE TABLE-instructie wordt vervolgens uitgevoerd:

CREATE TABLE NewTable (Column1 int);

De EVENTDATA()-instructie in de DDL-trigger legt de tekst vast van de CREATE TABLE-instructie die niet is toegestaan. Dit wordt bereikt door een XQuery-instructie te gebruiken op de xml- gegevens die worden gegenereerd door EVENTDATA en door het element <CommandText> op te halen. Zie XQuery Language Reference (SQL Server)voor meer informatie.

Voorzichtigheid

EVENTDATA legt de gegevens van CREATE_SCHEMA gebeurtenissen vast, evenals de <schema_element> van de overeenkomstige CREATE SCHEMA definitie, indien aanwezig. Daarnaast herkent EVENTDATA de <schema_element> definitie als een afzonderlijke gebeurtenis. Daarom kan een DDL-trigger die zowel op een CREATE_SCHEMA gebeurtenis als op een gebeurtenis wordt weergegeven door de <schema_element> van de CREATE SCHEMA definitie, dezelfde gebeurtenisgegevens twee keer teruggeven, zoals de TSQLCommand data. Denk bijvoorbeeld aan een DDL-trigger die wordt gemaakt op zowel de CREATE_SCHEMA als CREATE_TABLE gebeurtenissen en de volgende batch wordt uitgevoerd:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Als de toepassing de TSQLCommand gegevens van de gebeurtenis CREATE_TABLE ophaalt, moet u er rekening mee houden dat deze gegevens twee keer kunnen worden weergegeven: wanneer de CREATE_SCHEMA gebeurtenis plaatsvindt en nogmaals wanneer de CREATE_TABLE gebeurtenis plaatsvindt. Vermijd het creëren van DDL-triggers op zowel de CREATE_SCHEMA events als de <schema_element> teksten van eventuele bijbehorende CREATE SCHEMA definities, of bouw logica in je applicatie zodat hetzelfde event niet twee keer wordt verwerkt.

ALTER TABLEen Evenementen ALTER DATABASE

De gebeurtenisgegevens voor de gebeurtenissen ALTER_TABLE en ALTER_DATABASE bevatten ook de namen en typen andere objecten die worden beïnvloed door de DDL-instructie en de actie die op deze objecten wordt uitgevoerd. De ALTER_TABLE gebeurtenisgegevens omvatten de namen van de kolommen, constraints of triggers die door de ALTER TABLE instructie worden beïnvloed en de actie (aanmaken, wijzigen, verwijderen, inschakelen of uitschakelen) die op de getroffen objecten wordt uitgevoerd. De ALTER_DATABASE gebeurtenisgegevens omvatten de namen van alle bestanden of bestandsgroepen die door de ALTER DATABASE instructie worden beïnvloed en de actie (aanmaken, wijzigen of verwijderen) uitgevoerd op de getroffen objecten.

Maak bijvoorbeeld de volgende DDL-trigger in de AdventureWorks-voorbeelddatabase:

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;  

Voer dan de volgende ALTER TABLE instructie uit die een beperking schendt:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

Met de instructie EVENTDATA() in de DDL-trigger wordt de tekst vastgelegd van de ALTER TABLE-instructie die niet is toegestaan.

Voorbeeld

U kunt de functie EVENTDATA gebruiken om een logboek met gebeurtenissen te maken. In het volgende voorbeeld wordt een tabel gemaakt om gebeurtenisgegevens op te slaan. Er wordt vervolgens een DDL-trigger gemaakt in de huidige database die de tabel vult met de volgende informatie wanneer een DDL-gebeurtenis op databaseniveau plaatsvindt:

  • De tijd van de gebeurtenis (met behulp van de functie GETDATE).

  • De databasegebruiker waarvan de sessie het evenement heeft ondergaan (met behulp van de functie CURRENT_USER).

  • Het type gebeurtenis.

  • De Transact-SQL-verklaring die deel uitmaakte van de gebeurtenis.

Ook hier worden de laatste twee items vastgelegd met behulp van XQuery op basis van de XML- gegevens die worden gegenereerd door 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  

Notitie

Als u gebeurtenisgegevens wilt retourneren, wordt u aangeraden de methode XQuery value() te gebruiken in plaats van de methode query(). De methode query() retourneert XML- en ampersand-escaped regelterugloop- en CRLF-exemplaren (Line-Feed) in de uitvoer, terwijl de value() methode CRLF-exemplaren onzichtbaar maakt in de uitvoer.

Een vergelijkbaar voorbeeld van een DDL-trigger wordt geleverd met de AdventureWorks2025 voorbeelddatabase. Als u het voorbeeld wilt ophalen, zoekt u de map Databasetriggers met behulp van SQL Server Management Studio. Deze map bevindt zich onder de Programmability-map van de AdventureWorks2025-database. Klik met de rechtermuisknop op ddlDatabaseTriggerLog en selecteer Script Database Trigger als. DDL-trigger ddlDatabaseTriggerLog- is standaard uitgeschakeld.

Zie ook

DDL-gebeurtenissen
DDL-gebeurtenisgroepen