Bagikan melalui


EVENTDATA (Transact-SQL)

Berlaku untuk: SQL ServerAzure SQL Database Azure SQL Managed Instance

Fungsi ini mengembalikan informasi tentang peristiwa server atau database. Ketika pemberitahuan peristiwa diaktifkan, dan broker layanan yang ditentukan menerima hasilnya, EVENTDATA dipanggil. Pemicu DDL atau masuk juga mendukung penggunaan EVENTDATAinternal .

Konvensi sintaks transact-SQL

Sintaks

EVENTDATA( )

Keterangan

EVENTDATA mengembalikan data hanya ketika dirujuk langsung di dalam DDL atau pemicu masuk. EVENTDATA mengembalikan null jika rutinitas lain memanggilnya, bahkan jika pemicu DDL atau masuk memanggil rutinitas tersebut.

Data yang dikembalikan oleh EVENTDATA tidak valid setelah transaksi yang

  • disebut EVENTDATA secara eksplisit
  • disebut EVENTDATA secara implisit
  • penerapan
  • digulung balik

Perhatian

EVENTDATA mengembalikan data XML, dikirim ke klien sebagai Unicode yang menggunakan 2 byte untuk setiap karakter. EVENTDATA mengembalikan XML yang dapat mewakili titik kode Unicode ini:

0x0009

0x000A

0x000D

>= 0x0020 && <= 0xD7FF

>= 0xE000 && <= 0xFFFD

XML tidak dapat mengekspresikan, dan tidak akan mengizinkan, beberapa karakter yang dapat muncul di pengidentifikasi dan data Transact-SQL. Karakter atau data yang memiliki titik kode yang tidak diperlihatkan dalam daftar sebelumnya dipetakan ke tanda tanya (?).

Kata sandi tidak ditampilkan ketika CREATE LOGIN atau ALTER LOGIN pernyataan dijalankan. Ini melindungi keamanan masuk.

Skema Dikembalikan

EVENTDATA mengembalikan nilai xml tipe data. Secara default, definisi skema untuk semua peristiwa diinstal dalam direktori ini: C:\Program Files\Microsoft SQL Server\nnn\Tools\Binn\schemas\sqlserver\2006\11\events\events.xsd.

Halaman web Skema XML Microsoft SQL Server juga memiliki skema peristiwa.

Untuk mengekstrak skema untuk peristiwa tertentu, cari skema untuk Jenis EVENT_INSTANCE_<event_type>Kompleks . Misalnya, untuk mengekstrak skema untuk DROP_TABLE peristiwa, cari skema untuk EVENT_INSTANCE_DROP_TABLE.

Contoh

J. Mengkueri data peristiwa dalam pemicu DDL

Contoh ini membuat pemicu DDL yang mencegah pembuatan tabel database baru. Penggunaan XQuery terhadap data XML yang dihasilkan oleh EVENTDATA menangkap pernyataan Transact-SQL yang mengaktifkan pemicu. Lihat Referensi Bahasa XQuery (SQL Server) untuk informasi selengkapnya.

Catatan

Saat menggunakan Hasil ke Kisi di SQL Server Management Studio untuk mengkueri <TSQLCommand> elemen, hentian baris dalam teks perintah tidak muncul. Gunakan Hasil untuk Teks sebagai gantinya.

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  

Catatan

Untuk mengembalikan data peristiwa, gunakan metode XQuery value() alih-alih metode query(). Metode query() mengembalikan instans XML dan ampersand-escaped carriage return dan line feed (CR/LF) dalam output, sementara metode value() merender instans CR/LF tidak terlihat dalam output.

B. Membuat tabel log dengan data peristiwa dalam pemicu DDL

Contoh ini membuat tabel untuk penyimpanan informasi tentang semua peristiwa tingkat database, dan mengisi tabel tersebut dengan pemicu DDL. Penggunaan XQuery terhadap data XML yang dihasilkan oleh EVENTDATA menangkap jenis peristiwa dan pernyataan Transact-SQL.

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  

Lihat Juga

Menggunakan Fungsi EVENTDATA
Pemicu DDL
Pemberitahuan Peristiwa
Pemicu Masuk