Aracılığıyla paylaş


eventdata işlevini kullanma

DDL tetikleyicisi harekete olay hakkında bilgi eventdata işlev tarafından yakalanır.Bu işlev verir bir xml değer.xml şeması hakkında aşağıdaki bilgileri içerir:

  • saat Olay.

  • 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 sonra olayın oluştuğu, 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 içinde oluşturulan AdventureWorks2008R2 örnek veritabanı:

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 deyim sonra çalıştırın:

    CREATE TABLE NewTable (Column1 int);

The EVENTDATA() statement in the DDL trigger captures the text of the CREATE TABLE statement that is not allowed.Bu bir XQuery kullanarak elde deyim karşı xml eventdata ve alma tarafından oluşturulan veri <CommandText> öğesi.Daha fazla bilgi için bkz: XQuery dil başvurusu (veritabanı altyapısı).

Dikkat notuDikkat

eventdata create_schema Olay verileri yakalar yanı <schema_element, tanımladığınız şemada> varsa karşılık gelen şema oluşturma tanımı,.Ayrıca, eventdata tanıdığı <schema_element, tanımladığınız şemada> tanımı olarak ayrı bir olay.Bu nedenle, DDL tetikleyicisi oluşturulan bir iki create_schema olayı ve bir olayı temsil ettiği <schema_element, tanımladığınız şemada> create schema definition, aynı olay verileri döndürebilir gibi iki kez, TSQLCommand veri.Örneğin, hem create_schema hem de create_table olaylar üzerinde oluşturulan DDL tetikleyicisi düşünün ve aşağıdaki toplu iş iş işi çalıştırın:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Uygulama alırsa, TSQLCommand veri create_table olay farkında bu veriler iki kez görünebilir: bir kez create_schema olay oluştuğunda ve yeniden create_table olay ortaya çıktığında.Her iki create_schema olaylar üzerinde ddl Tetikleyiciler oluşturmaktan kaçının ve <schema_element, tanımladığınız şemada> ilgili herhangi bir create schema tanımlarının metinleri veya böylece aynı olay iki kez işlenen mantık uygulamanıza oluşturulması.

alter table ve alter database olayları

alter_table ve alter_database olayları için Olay verileri ddl deyim tarafından etkilenen diğer nesneleri ve bu nesneler üzerinde gerçekleştirilen eylem türleri ve adlarını da içerir.alter_table Olay verileri sütunlar, kısıtlamalar veya alter table deyim ve eylem tarafından etkilenen Tetikleyiciler adlarını içerir (oluşturma, alter, drop, etkinleştirmek veya devre dışı bırakma) etkilenen nesne üzerinde gerçekleştirilen.alter_database Olay verileri tüm dosyaları ve dosya gruplarını alter database deyim ve eylem tarafından etkilenen adlarını içerir (oluşturma, alter veya drop) etkilenen nesne ü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;

Daha sonra yürütmek bir kısıtlamayı ihlal eden aşağıdaki alter table deyim:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date; 

DDL tetikleyicisi eventdata() deyiminde metni yakalar ALTER TABLE deyim izin verilir.

Örnek

eventdata kullanabilirsiniz işlev olay günlüğünü oluşturmak için.Aşağıdaki örnekte, olay bilgilerini depolamak için bir tablo oluşturulur.DDL tetikleyicisi sonra herhangi her aşağıdaki bilgileri içeren tablo doldurur geçerli veritabanında oluşturulan veritabanı -düzey ddl olay oluşur:

  • saat (getdate işlevini kullanarak) olay.

  • Whose karşı veritabanı kullanıcı oturum (örnein işlevini kullanarak) olay oluştu.

  • Olay türü.

  • The Transact-SQL statement that comprised the event.

Son iki öğe karşı XQuery kullanarak yeniden yakalanan xml eventdata tarafından oluşturulan veri

USE AdventureWorks2008R2;
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 döndürmek için XQuery kullanın önerilir value() yerine query() yöntem.The query() method returns XML and ampersand-escaped carriage return and line-feed (CRLF) instances in the output, while the value() method renders CRLF instances invisible in the output.

Benzer DDL tetikleyicisi örnek ile sağlanan AdventureWorks2008R2 örnek veritabanı.Örnek edinmek için kullanarak veritabanı Tetikleyiciler klasörü bulun SQL Server Management Studio.Bu klasörün altında bulunan programlama klasörüne AdventureWorks veritabanı.Sağ ddlDatabseTriggerLog ve Komut dosyası veritabanı tetikleyici olarak.Varsayılan olarak, DDL tetikleyicisi ddlDatabseTriggerLog devre dışı bırakılır.

Ayrıca bkz.

Kavramlar