EVENTDATA işlevini kullanarak
Bilgiler bir olay DDL tetikleyicisi olay VERI işlevi kullanılarak yakalanan, harekete geçirilir.Bu işlev verdiği bir xml Değer. XML şeması, aşağıdakiler hakkında bilgi içerir:
Olay saat.
Sistem işlem KIMLIĞI (SPID) tetikleyici çalıştırıldığında bağlantı.
Tetikleyici harekete olay türü.
Olay türüne bağlı olarak, şema ardından, olayın, karşı olayın oluştuğu, nesne veritabanı gibi ek bilgileri içerir ve Transact-SQL deyim olay. Daha fazla bilgi için bkz:EVENTDATA (Transact-SQL).
Örneğin, aşağıdaki DDL tetikleyicisi yaratılan AdventureWorks Örnek Veritabanı'nı tıklatın:
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
;
Aşağıdaki CREATE TABLE deyimini çalıştırın:
CREATE TABLE NewTable (Column1 int);
The EVENTDATA() deyim in the DDL tetikleyicisi captures the text of the CREATE TABLE deyim that is not allowed. Bu karşı XQuery deyim kullanılarak sağlanır xml veri alma ve EVENTDATA tarafından oluşturulan <CommandText> Öğe. Daha fazla bilgi için bkz:XQuery Language Reference (Veritabanı Altyapısı).
Uyarı
Veri CREATE_SCHEMA olayların EVENTDATA yakalar yaný sýra <schema_element> tanım, varsa ilgili CREATE ŞEMASıNı var. Ayrıca, EVENTDATA tanıdığı <schema_element> tanım olarak ayrı bir olay. Bu nedenle, her iki bir CREATE_SCHEMA olayda DDL tetikleyicisi oluşturulan ve bir olayı temsil <schema_element> CREATE ŞEMASıNı, tanım, aynı Olay verisi döndürebilir gibi iki defa TSQLCommand Veri. Örneğin, DDL tetikleyicisi CREATE_SCHEMA hem CREATE_TABLE olaylarına oluşturulan göz önünde bulundurun ve aşağıdaki toplu iş çalıştırın:
CREATE SCHEMA s
CREATE TABLE t1 (col1 int)
Uygulama alır, TSQLCommand Bu veriler, iki kez görünebilir CREATE_TABLE olay veri unutmayın: bir kez CREATE_SCHEMA olayı oluştuğunda ve yeniden CREATE_TABLE olayı oluştuğunda. Her iki CREATE_SCHEMA olayları DDL Tetikleyicileri oluşturmaktan kaçının ve <schema_element> herhangi bir metin, CREATE SCHEMA tanımları karşılık gelen veya mantığı, böylece aynı olay, iki kez işlenmez uygulamanıza oluşturun.
Tablo ve ALTER DATABASE olayları ALTER
ALTER_TABLE ve ALTER_DATABASE olayları için Olay verileri de DDL'YI tarafından etkilenen diğer nesne türlerini ve adları içerir deyim ve bu nesneler üzerinde gerçekleştirilecek.Olay verileri ALTER_TABLE sütunlar, kısıtlamalar ve ALTER tablo deyim ve eylem tarafından etkilenen Tetikleyicileri adlarını içerir (oluşturma, değiştirme, bırakma, etkinleştirme veya devre dışı) etkilenen nesneleri üzerinde gerçekleştirilen.Olay verileri ALTER_DATABASE herhangi bir dosya veya dosya gruplarını ALTER DATABASE deyimini ve eylem tarafından etkilenen adlarını içerir (oluşturma, değiştirme veya bırakma) etkilenen nesneleri üzerinde gerçekleştirilen.
Örneğin, aşağıdaki DDL tetikleyicisi AdventureWorks örnek veritabanında 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;
Sonra yürütmek kısıtlamayı ihlal eden aşağıdaki ALTER tablo deyim:
ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date;
DDL tetikleyicisi EVENTDATA() deyiminde metni yakalar ALTER TABLE deyim verilmez.
Örnek
EVENTDATA işlev, bir olay günlüğü oluşturmak için kullanabilirsiniz.Aşağıdaki örnekte, bir tablo, olay bilgilerini depolamak için oluşturulur.DDL tetikleyicisi, sonra herhangi bir veritabanı düzey DDL olayı her gerçekleştiğinde aşağıdaki bilgileri içeren tabloyu doldurur geçerli veritabanında oluşturulur:
Olay saat (the GETDATE kullanarak işlev).
Veritabanı kullanıcı oturumunun, (örnein işlevini kullanarak) olay.
olay türü.
The Transact-SQL deyim that comprised the olay.
Son iki öğe XQuery karşı kullanarak yeniden yakalanan xml veri EVENTDATA tarafından oluşturulur.
USE AdventureWorks;
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 verileri geri dönmek için , the XQuery kullanmanızı öneririz value() yöntem yerine query() yöntem. The query() yöntem returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() yöntem renders CRLF instances invisible in the output.
Benzer bir DDL tetikleyicisi örnek ile sağlanan AdventureWorks Örnek Veritabanı'nı tıklatın. Örnek elde etmek için kullanarak veritabanı Tetikleyicileri klasörünü bulun SQL Server Management Studio. Bu klasörün altında bulunan Programlama klasöründeAdventureWorks veritabanıdır.Sağ tıklatma ddlDatabseTriggerLog ve seçme Komut dosyası veritabanı harekete geçirici olarak.Varsayılan olarak, DDL tetikleyicisi ddlDatabseTriggerLog devre dışı bırakılır.