eventdata işlevini kullanma

ddl tetikleyici harekete olay hakkında bilgi eventdata işlevini kullanarak ele geçirildi. Bu işlevi bir xmldeğer. xml şeması hakkında aşağıdaki bilgileri içerir:

  • Olay saati.

  • Sistem işlem Kımlığı (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, veritabanı karşı olayın oluştuğu, nesne gibi ek bilgileri içerir ve Transact-SQLdeyimi olay. Daha fazla bilgi için, bkz. ddl Tetikleyicileri.

Örneğin, aşağıdaki ddl tetikleyici oluşturulur AdventureWorks2012 ö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 TABLEdeyimini çalıştırın:

    CREATE TABLE NewTable (Column1 int);

EVENTDATA()ddl tetikleyici deyiminde metni yakalar CREATE TABLE izin verilmeyen açıklamada. Bu karşı bir XQuery deyimini kullanarak elde xmleventdata ve alma tarafından oluşturulan veri <CommandText > öğesi. Daha fazla bilgi için, bkz. XQuery dil başvurusu (SQL Server).

Dikkat notuDikkat

eventdata yakalar create_schema olayları verilerin yanı sıra <schema_element> birisi varsa, karşılık gelen create schema tanımı. Ayrıca eventdata tanır <schema_element> tanımı olarak ayrı bir olay. Bu nedenle, ddl tetikleyici oluşturulan her bir create_schema olay ve olay temsil tarafından <schema_element> create şema tanımı dönüş aynı olay verileri gibi iki kez TSQLCommandveri. Örneğin, hem create_schema hem de create_table olaylara oluşturulan ddl tetikleyici düşünün ve aşağıdaki toplu işi çalıştırılır:

CREATE SCHEMA s

CREATE TABLE t1 (col1 int)

Eğer uygulama alır TSQLCommandcreate_table Olay verileri bu veri iki kez görünebilir farkında: bir kez create_schema olay oluştuğunda ve tekrar create_table olayı oluştuğunda. ddl Tetikleyiciler hem create_schema olaylara oluşturmaktan kaçının ve <schema_element> ilgili herhangi bir create schema tanımları metinleri veya mantık uygulamanıza inşa aynı olay iki defa işlenmez.

alter table ve alter database olayları

ALTER_TABLETO ve alter_database olayları için Olay verileri de adları ve ddl deyimi tarafından etkilenen diğer nesneleri ve bu nesneler üzerinde gerçekleştirilen eylem türlerini içerir. ALTER_TABLETO Olay verileri sütunlar, kısıtlamaları veya alter table deyimi ve eylem tarafından etkilenen Tetikleyiciler adlarını içerir (oluşturma, değiştirme, bırakma, etkinleştirme veya devre dışı) etkilenen nesne üzerinde gerçekleştirilen. alter_database Olay verileri herhangi bir dosya veya filegroups alter database deyimi ve eylem tarafından etkilenen adlarını içerir (oluşturmak, değiştirmek veya bırak) etkilenen nesne üzerinde gerçekleştirilen.

Örneğin, aşağıdaki ddl tetikleyici 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 bir kısıtlamayı ihlal eden aşağıdaki alter table deyimini yürütün:

ALTER TABLE Person.Address ALTER COLUMN ModifiedDate date; 

ddl tetikleyici eventdata() deyiminde metni yakalar ALTER TABLE açıklamada verilmez.

Örnek

Olay günlüğünü oluşturmak için eventdata işlevini kullanabilirsiniz. Aşağıdaki örnek, olay bilgilerini depolamak için bir tablo oluşturulur. ddl tetikleyici sonra herhangi bir veritabanı düzeyinde ddl olay oluştuğunda aşağıdaki bilgileri içeren tabloyu doldurur geçerli veritabanında oluşturulur:

  • (getdate işlevini kullanarak) olay zaman.

  • Veritabanı kullanıcı oturumunu karşı (current_user işlevini kullanarak) olay oluştu.

  • Olay türü.

  • Transact-SQLOluşan olay bildirimi.

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

USE AdventureWorks2012;
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 kullanmanızı öneririz value()yöntemi yerine query()yöntemi. query()Yöntemi, Çıkışta, xml ve işareti kaçtı satırbaşı ve satır besleme (crlf) örneklerini döndürür ise value()yöntemi crlf örnekleri çıktısında görünmez işler.

Benzer bir ddl tetikleyici örnek ile sağlanan AdventureWorks2012 ö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 AdventureWorks2012veritabanı. Sağ ddlDatabseTriggerLog ve Komut dosyası veritabanı tetikleyici olarak. Varsayılan olarak, ddl tetikleyici ddlDatabseTriggerLog devre dışı bırakılır.

Ayrıca bkz.

Kavramlar

ddl olayları

ddl olay grupları