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 EVENTDATA
internal .
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