Aracılığıyla paylaş


EVENTDATA (Transact-SQL)

Şunlar için geçerlidir:SQL ServerAzure SQL VeritabanıAzure SQL Yönetilen Örneği

Bu işlev, sunucu veya veritabanı olayları hakkında bilgi döndürür. Bir olay bildirimi tetiklendiğinde ve belirtilen hizmet aracısı sonuçları EVENTDATA aldığında çağrılır. DDL veya oturum açma tetikleyicisi, iç kullanımını EVENTDATAda destekler.

Transact-SQL söz dizimi kuralları

Sözdizimi

EVENTDATA( )

Açıklamalar

EVENTDATA verileri yalnızca doğrudan bir DDL veya oturum açma tetikleyicisinin içinde başvurulduğunda döndürür. EVENTDATA DDL veya oturum açma tetikleyicisi bu yordamları çağırsa bile diğer yordamlar çağırsa null döndürür.

tarafından EVENTDATA döndürülen veriler, bir işlemden sonra geçersiz

  • açıkça çağrıldı EVENTDATA
  • örtük olarak çağrıldı EVENTDATA
  • işlemeler
  • geri alınır

Dikkat

EVENTDATA , istemciye her karakter için 2 bayt kullanan Unicode olarak gönderilen XML verilerini döndürür. EVENTDATA şu Unicode kod noktalarını temsil eden XML döndürür:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML, Transact-SQL tanımlayıcılarda ve verilerde gösterilebilen bazı karakterleri ifade edemez ve izin vermez. Önceki listede gösterilmeyen kod noktaları olan karakterler veya veriler bir soru işaretine (?) eşlenir.

Veya ALTER LOGIN deyimleri yürütülürken CREATE LOGIN parolalar görüntülenmez. Bu, oturum açma güvenliğini korur.

Döndürülen Şemalar

EVENTDATA , xml veri türü değerini döndürür. Varsayılan olarak, tüm olayların şema tanımı şu dizine yüklenir: <sürücü>:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Microsoft SQL Server XML Şemaları web sayfasında olay şeması da bulunur.

Belirli bir olayın şemasını ayıklamak için, karmaşık türü için şemada arama.EVENT_INSTANCE_<event_type> Örneğin, olayın şemasını ayıklamak için DROP_TABLE şemada araması yapmak için EVENT_INSTANCE_DROP_TABLE.

Örnekler

A. DDL tetikleyicisinde olay verilerini sorgulama

Bu örnek, yeni veritabanı tablolarının oluşturulmasını engelleyen bir DDL tetikleyicisi oluşturur. tarafından oluşturulan EVENTDATA XML verilerine karşı XQuery kullanımı, tetikleyiciyi tetikleyen Transact-SQL deyimini yakalar. Daha fazla bilgi için bkz. XQuery Dil Başvurusu (SQL Server).

Uyarı

SQL Server Management Studio'da öğesini sorgulamak <TSQLCommand> için Results to Grid kullanıldığında, komut metnindeki satır sonları görünmez. Bunun yerine Sonuçlardan Metne'yi kullanın.

USE AdventureWorks2022;  
GO  
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  
;  
GO  
--Test the trigger.  
CREATE TABLE NewTable (Column1 INT);  
GO  
--Drop the trigger.  
DROP TRIGGER safety  
ON DATABASE;  
GO  

Uyarı

Olay verilerini döndürmek için query() yöntemi yerine XQuery value() yöntemini kullanın. query() yöntemi çıkışta XML ve ve kaçışlı satır başı ve satır besleme (CR/LF) örneklerini döndürürken value() yöntemi cr/lf örneklerini çıkışta görünmez hale getirir.

B. DDL tetikleyicisinde olay verileriyle günlük tablosu oluşturma

Bu örnek, tüm veritabanı düzeyindeki olaylar hakkında bilgi depolaması için bir tablo oluşturur ve bu tabloyu bir DDL tetikleyicisiyle doldurur. XQuery'nin tarafından EVENTDATA oluşturulan XML verilerine karşı kullanılması, olay türünü ve Transact-SQL deyimini yakalar.

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  
--Drop the trigger.  
DROP TRIGGER log  
ON DATABASE;  
GO  
--Drop table ddl_log.  
DROP TABLE ddl_log;  
GO  

Ayrıca Bkz.

EVENTDATA İşlevini kullanma
DDL Tetikleyicileri
Olay Bildirimleri
Oturum Açma Tetikleyicileri