Bagikan melalui


MEMBUAT PEMBERITAHUAN PERISTIWA (Transact-SQL)

Berlaku untuk: SQL Server Azure SQL Managed Instance

Membuat objek yang mengirim informasi tentang database atau peristiwa server ke layanan broker layanan. Pemberitahuan peristiwa dibuat hanya dengan menggunakan pernyataan Transact-SQL.

Konvensi sintaks transact-SQL

Sintaksis

CREATE EVENT NOTIFICATION event_notification_name   
ON { SERVER | DATABASE | QUEUE queue_name }   
[ WITH FAN_IN ]  
FOR { event_type | event_group } [ ,...n ]  
TO SERVICE 'broker_service' , { 'broker_instance_specifier' | 'current database' }  
[ ; ]  

Catatan

Untuk melihat sintaks Transact-SQL untuk SQL Server 2014 (12.x) dan versi yang lebih lama, lihat Dokumentasi versi sebelumnya.

Argumen

event_notification_name
Adalah nama pemberitahuan peristiwa. Nama pemberitahuan peristiwa harus mematuhi aturan untuk pengidentifikasi dan harus unik dalam cakupan tempat mereka dibuat: SERVER, DATABASE, atau object_name.

SERVER
Menerapkan cakupan pemberitahuan peristiwa ke instans SQL Server saat ini. Jika ditentukan, pemberitahuan diaktifkan setiap kali peristiwa yang ditentukan dalam klausul FOR terjadi di mana saja dalam instans SQL Server.

Catatan

Opsi ini tidak tersedia dalam database mandiri.

DATABASE
Menerapkan cakupan pemberitahuan peristiwa ke database saat ini. Jika ditentukan, pemberitahuan akan diaktifkan setiap kali peristiwa yang ditentukan dalam klausul FOR terjadi dalam database saat ini.

ANTREAN
Menerapkan cakupan pemberitahuan ke antrean tertentu dalam database saat ini. ANTREAN hanya dapat ditentukan jika FOR QUEUE_ACTIVATION atau FOR BROKER_QUEUE_DISABLED juga ditentukan.

queue_name
Adalah nama antrean tempat pemberitahuan peristiwa berlaku. queue_name hanya dapat ditentukan jika ANTREAN ditentukan.

DENGAN FAN_IN
Menginstruksikan SQL Server untuk hanya mengirim satu pesan per peristiwa ke layanan tertentu untuk semua pemberitahuan peristiwa yang:

  • Dibuat pada peristiwa yang sama.

  • Dibuat oleh prinsipal yang sama (seperti yang diidentifikasi oleh SID yang sama).

  • Tentukan layanan dan broker_instance_specifier yang sama.

  • Tentukan WITH FAN_IN.

Misalnya, tiga pemberitahuan peristiwa dibuat. Semua pemberitahuan peristiwa menentukan FOR ALTER_TABLE, WITH FAN_IN, klausa TO SERVICE yang sama, dan dibuat oleh SID yang sama. Saat pernyataan ALTER TABLE dijalankan, pesan yang dibuat oleh ketiga pemberitahuan peristiwa ini digabungkan menjadi satu. Oleh karena itu, layanan target hanya menerima satu pesan peristiwa.

event_type
Adalah nama jenis peristiwa yang menyebabkan pemberitahuan peristiwa dijalankan. event_type dapat berupa jenis peristiwa DDL Transact-SQL, jenis peristiwa SQL Trace, atau jenis peristiwa Service Broker. Untuk daftar jenis peristiwa DDL Transact-SQL yang memenuhi syarat, lihat Peristiwa DDL. Jenis peristiwa Service Broker QUEUE_ACTIVATION dan BROKER_QUEUE_DISABLED. Untuk informasi selengkapnya, lihat Pemberitahuan Peristiwa.

event_group
Adalah nama grup yang telah ditentukan sebelumnya dari jenis peristiwa Transact-SQL atau SQL Trace. Pemberitahuan peristiwa dapat diaktifkan setelah eksekusi peristiwa apa pun yang termasuk dalam grup peristiwa. Untuk daftar grup peristiwa DDL, peristiwa Transact-SQL yang dicakupnya, dan cakupan di mana mereka dapat ditentukan, lihat Grup Peristiwa DDL.

event_group juga bertindak sebagai makro, ketika pernyataan CREATE EVENT NOTIFICATION selesai, dengan menambahkan jenis peristiwa yang dicakupnya ke tampilan katalog sys.events.

' broker_service '
Menentukan layanan target yang menerima data instans peristiwa. SQL Server membuka satu atau beberapa percakapan ke layanan target untuk pemberitahuan peristiwa. Layanan ini harus mematuhi jenis dan kontrak pesan Peristiwa SQL Server yang sama yang digunakan untuk mengirim pesan.

Percakapan tetap terbuka hingga pemberitahuan peristiwa dihilangkan. Kesalahan tertentu dapat menyebabkan percakapan ditutup sebelumnya. Mengakhiri beberapa atau semua percakapan secara eksplisit dapat mencegah layanan target menerima lebih banyak pesan.

{ 'broker_instance_specifier' | 'database saat ini' }
Menentukan instans broker layanan tempat broker_service diselesaikan. Nilai untuk broker layanan tertentu dapat diperoleh dengan mengkueri kolom service_broker_guid tampilan katalog sys.databases . Gunakan 'database saat ini' untuk menentukan instans broker layanan dalam database saat ini. 'database saat ini' adalah string literal yang tidak peka huruf besar/kecil.

Catatan

Opsi ini tidak tersedia dalam database mandiri.

Keterangan

Service Broker mencakup jenis pesan dan kontrak khusus untuk pemberitahuan peristiwa. Oleh karena itu, layanan yang memulai Service Broker tidak harus dibuat karena sudah ada yang menentukan nama kontrak berikut: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

Layanan target yang menerima pemberitahuan peristiwa harus mematuhi kontrak yang sudah ada sebelumnya ini.

Penting

Keamanan dialog Service Broker harus dikonfigurasi untuk pemberitahuan peristiwa yang mengirim pesan ke broker layanan di server jarak jauh. Keamanan dialog harus dikonfigurasi secara manual sesuai dengan model keamanan penuh. Untuk informasi selengkapnya, lihat Mengonfigurasi Keamanan Dialog untuk Pemberitahuan Peristiwa.

Jika transaksi peristiwa yang mengaktifkan pemberitahuan digulung balik, pengiriman pemberitahuan peristiwa juga digulung balik. Pemberitahuan peristiwa tidak diaktifkan oleh tindakan yang ditentukan dalam pemicu saat transaksi dilakukan atau digulung balik di dalam pemicu. Karena peristiwa pelacakan tidak terikat oleh transaksi, pemberitahuan peristiwa berdasarkan peristiwa pelacakan dikirim terlepas dari apakah transaksi yang mengaktifkannya digulung balik.

Jika percakapan antara server dan layanan target rusak setelah pemberitahuan peristiwa diaktifkan, kesalahan dilaporkan dan pemberitahuan peristiwa dihilangkan.

Transaksi peristiwa yang awalnya memulai pemberitahuan tidak terpengaruh oleh keberhasilan atau kegagalan pengiriman pemberitahuan peristiwa.

Setiap kegagalan untuk mengirim pemberitahuan peristiwa dicatat.

Izin

Untuk membuat pemberitahuan peristiwa yang terlingkup ke database (ON DATABASE), memerlukan izin CREATE DATABASE DDL EVENT NOTIFICATION di database saat ini.

Untuk membuat pemberitahuan peristiwa pada pernyataan DDL yang terlingkup ke server (ON SERVER), memerlukan izin CREATE DDL EVENT NOTIFICATION di server.

Untuk membuat pemberitahuan peristiwa pada peristiwa pelacakan, memerlukan izin CREATE TRACE EVENT NOTIFICATION di server.

Untuk membuat pemberitahuan peristiwa yang dilingkup ke antrean, memerlukan izin ALTER pada antrean.

Contoh

Catatan

Dalam Contoh A dan B di bawah ini, GUID dalam TO SERVICE 'NotifyService' klausul ('8140a771-3c4b-4479-8ac0-81008ab17984') khusus untuk komputer tempat contoh disiapkan. Untuk instans tersebut, itu adalah GUID untuk database AdventureWorks2022.

Untuk menyalin dan menjalankan contoh ini, Anda perlu mengganti GUID ini dengan satu dari komputer dan instans SQL Server Anda. Seperti yang dijelaskan di bagian Argumen di atas, Anda dapat memperoleh 'broker_instance_specifier' dengan mengkueri kolom service_broker_guid tampilan katalog sys.databases.

J. Membuat pemberitahuan peristiwa yang dilingkup server

Contoh berikut membuat objek yang diperlukan untuk menyiapkan layanan target menggunakan Service Broker. Layanan target mereferensikan jenis pesan dan kontrak layanan yang dimulai khusus untuk pemberitahuan peristiwa. Kemudian pemberitahuan peristiwa dibuat pada layanan target yang mengirim pemberitahuan setiap kali Object_Created peristiwa pelacakan terjadi pada instans SQL Server.

--Create a queue to receive messages.  
CREATE QUEUE NotifyQueue ;  
GO  

--Create a service on the queue that references  
--the event notifications contract.  
CREATE SERVICE NotifyService  
ON QUEUE NotifyQueue  
([https://schemas.microsoft.com/SQL/Notifications/PostEventNotification]);  
GO  

--Create a route on the service to define the address   
--to which Service Broker sends messages for the service.  
CREATE ROUTE NotifyRoute  
WITH SERVICE_NAME = 'NotifyService',  
ADDRESS = 'LOCAL';  
GO 

--Create the event notification.  
CREATE EVENT NOTIFICATION log_ddl1   
ON SERVER   
FOR Object_Created   
TO SERVICE 'NotifyService',  
    '8140a771-3c4b-4479-8ac0-81008ab17984' ;  

B. Membuat pemberitahuan peristiwa yang dilingkup database

Contoh berikut membuat pemberitahuan peristiwa pada layanan target yang sama dengan contoh sebelumnya. Pemberitahuan peristiwa diaktifkan setelah ALTER_TABLE peristiwa terjadi pada database sampel AdventureWorks2022.

CREATE EVENT NOTIFICATION Notify_ALTER_T1  
ON DATABASE  
FOR ALTER_TABLE  
TO SERVICE 'NotifyService',  
    '8140a771-3c4b-4479-8ac0-81008ab17984';  

C. Mendapatkan informasi tentang pemberitahuan peristiwa yang dilingkup server

Contoh berikut mengkueri sys.server_event_notifications tampilan katalog untuk metadata tentang pemberitahuan log_ddl1 peristiwa yang dibuat dengan cakupan server.

SELECT * FROM sys.server_event_notifications  
WHERE name = 'log_ddl1';  

D. Mendapatkan informasi tentang pemberitahuan peristiwa yang dilingkup database

Contoh berikut mengkueri sys.event_notifications tampilan katalog untuk metadata tentang pemberitahuan Notify_ALTER_T1 peristiwa yang dibuat dengan cakupan database.

SELECT * FROM sys.event_notifications  
WHERE name = 'Notify_ALTER_T1';  

Lihat Juga

Pemberitahuan Peristiwa
HILANGKAN PEMBERITAHUAN PERISTIWA (T-SQL)
EVENTDATA (Transact-SQL)
sys.event_notifications (T-SQL)
sys.server_event_notifications (T-SQL)
sys.events (Transact-SQL)
sys.server_events (T-SQL)