Aracılığıyla paylaş


EVENTDATA İşlevini kullanma

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen ÖrneğiMicrosoft Fabric'te SQL veritabanı

DDL tetikleyicisini tetikleyen bir olay hakkındaki bilgiler, EVENTDATA işlevi kullanılarak yakalanır. Bu işlev bir xml değeri döndürür. XML şeması aşağıdakiler hakkında bilgi içerir:

  • Olayın zamanı.

  • Tetikleyici yürütülürken bağlantının Oturum Kimliği (SPID).

  • Tetikleyiciyi etkinleştiren olayın türü.

Olay türüne bağlı olarak, şema olayın oluştuğu veritabanı, olayın oluştuğu nesne ve olayın Transact-SQL deyimi gibi ek bilgiler içerir. Daha fazla bilgi için bkz. DDL Tetikleyicileri.

Örneğin, AdventureWorks2025 örnek veritabanında aşağıdaki DDL tetikleyicisi oluşturulur:

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  
;  

Ardından aşağıdaki CREATE TABLE deyimi çalıştırılır:

CREATE TABLE NewTable (Column1 int);

DDL tetikleyicisindeki EVENTDATA() deyimi, izin verilmeyen CREATE TABLE deyiminin metnini yakalar. Bu, EVENTDATA tarafından oluşturulan xml verilerine karşı bir XQuery deyimi kullanılarak ve <CommandText> öğesi alınarak elde edilir. Daha fazla bilgi için bkz. XQuery Dil Başvurusu (SQL Server).

Dikkat

EVENTDATA, CREATE_SCHEMA olaylarının verilerini ve varsa ilgili OLUŞTURMA ŞEMASI tanımının <schema_element>'ini yakalar. Ayrıca, EVENTDATA <schema_element> tanımını ayrı bir olay olarak tanır. Bu nedenle, hem CREATE_SCHEMA olayda hem de CREATE SCHEMA tanımının <schema_element> temsil edilen bir olayda oluşturulan bir DDL tetikleyicisi, TSQLCommand verileri gibi aynı olay verilerini iki kez döndürebilir. Örneğin, hem CREATE_SCHEMA hem de CREATE_TABLE olaylarında oluşturulan bir DDL tetikleyicisini ve aşağıdaki toplu işin çalıştırıldığını düşünün:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Uygulama CREATE_TABLE olayının TSQLCommand verilerini alırsa, bu verilerin iki kez görünebileceğini unutmayın: bir kez CREATE_SCHEMA olayı gerçekleştiğinde ve tekrar CREATE_TABLE olayı gerçekleştiğinde. hem CREATE_SCHEMA olaylarında hem de ilgili CREATE SCHEMA tanımlarının <schema_element> metinlerinde DDL tetikleyicileri oluşturmaktan kaçının veya aynı olayın iki kez işlenmemesi için uygulamanıza mantık oluşturun.

ALTER TABLE ve ALTER DATABASE Olayları

ALTER_TABLE ve ALTER_DATABASE olayları için olay verileri, DDL deyiminden etkilenen diğer nesnelerin adlarını ve türlerini ve bu nesneler üzerinde gerçekleştirilen eylemi de içerir. ALTER_TABLE olay verileri ALTER TABLE deyiminden etkilenen sütunların, kısıtlamaların veya tetikleyicilerin adlarını ve etkilenen nesneler üzerinde gerçekleştirilen eylemi (oluşturma, değiştirme, bırakma, etkinleştirme veya devre dışı bırakma) içerir. ALTER_DATABASE olay verileri ALTER DATABASE deyiminden etkilenen dosyaların veya dosya gruplarının adlarını ve etkilenen nesneler üzerinde gerçekleştirilen eylemi (oluşturma, değiştirme veya bırakma) içerir.

Örneğin, AdventureWorks örnek veritabanında aşağıdaki DDL tetikleyicisini oluşturun:

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;  

Ardından bir kısıtlamayı ihlal eden aşağıdaki ALTER TABLE deyimini yürütür:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;   

DDL tetikleyicisindeki EVENTDATA() deyimi, izin verilmeyen ALTER TABLE deyiminin metnini yakalar.

Örnek

Olay günlüğü oluşturmak için EVENTDATA işlevini kullanabilirsiniz. Aşağıdaki örnekte, olay bilgilerini depolamak için bir tablo oluşturulur. Ardından geçerli veritabanında veritabanı düzeyinde herhangi bir DDL olayı gerçekleştiğinde tabloyu aşağıdaki bilgilerle dolduran bir DDL tetikleyicisi oluşturulur:

  • Olayın zamanı (GETDATE işlevini kullanarak).

  • Olayın gerçekleştiği oturuma (CURRENT_USER işlevini kullanarak) karşılık gelen veritabanı kullanıcısı.

  • Olayın türü.

  • Olayı oluşturan Transact-SQL ifadesi.

Son iki öğe de EVENTDATA tarafından oluşturulan xml verilerine karşı XQuery kullanılarak yakalanır.

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  

Not

Olay verilerini döndürmek için query() yöntemi yerine XQuery value() yöntemini kullanmanızı öneririz. query() yöntemi, çıktıdaki XML ve ampersand-kaçışlı satır başı ve satır besleme (CRLF) örneklerini döndürürken, value() yöntemi CRLF örneklerini çıkışta görünmez hale getirir.

AdventureWorks2025 örnek veritabanıyla benzer bir DDL tetikleyici örneği sağlanır. Örneği almak için SQL Server Management Studio kullanarak Veritabanı Tetikleyicileri klasörünü bulun. Bu klasör, AdventureWorks2025 veritabanının Programlanabilirlik klasörü altında yer almaktadır. ddlDatabaseTriggerLog sağ tıklayın ve olarakBetik Veritabanı Tetikleyicisi'ne tıklayın. Varsayılan olarak, ddlDatabaseTriggerLog DDL tetikleyicisi devre dışıdır.

Ayrıca Bkz.

DDL Olayları
DDL Olay Grupları