다음을 통해 공유


CREATE EVENT NOTIFICATION(Transact-SQL)

적용 대상: SQL Server Azure SQL Managed Instance

데이터베이스 또는 서버 이벤트에 대한 정보를 service broker 서비스로 보내는 개체를 만듭니다. 이벤트 알림은 Transact-SQL 문을 사용해야만 생성됩니다.

Transact-SQL 구문 표기 규칙

구문

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' }  
[ ; ]  

인수

event_notification_name
이벤트 알림의 이름입니다. 이벤트 알림 이름은 식별자에 대한 규칙을 준수하고 이들을 만든 SERVER, DATABASE 또는 object_name 범위 내에서 고유해야 합니다.

SERVER
SQL Server의 현재 인스턴스에 이벤트 알림 범위를 적용합니다. 지정한 경우 SQL Server의 인스턴스에서 FOR 절에 지정한 이벤트가 발생할 때마다 알림이 발생합니다.

참고

포함된 데이터베이스에서는 이 옵션을 사용할 수 없습니다.

DATABASE
현재 데이터베이스에 이벤트 알림의 범위를 적용합니다. 지정한 경우 현재 데이터베이스에서 FOR 절에 지정한 이벤트가 발생할 때마다 알림이 발생합니다.

QUEUE
현재 데이터베이스의 특정 큐에 알림의 범위를 적용합니다. FOR QUEUE_ACTIVATION이나 FOR BROKER_QUEUE_DISABLED도 지정한 경우에만 QUEUE를 지정할 수 있습니다.

queue_name
이벤트 알림이 적용되는 큐의 이름입니다. queue_name은 QUEUE가 지정된 경우에만 지정할 수 있습니다.

WITH FAN_IN
다음과 같은 모든 이벤트 알림에 대해 지정한 모든 서비스에 이벤트당 하나씩만 메시지를 보내도록 SQL Server에 지시합니다.

  • 같은 이벤트에서 생성된 이벤트 알림

  • 같은 보안 주체(같은 SID로 식별됨)가 생성한 이벤트 알림

  • 같은 서비스 및 broker_instance_specifier를 지정합니다.

  • WITH FAN_IN을 지정하는 이벤트 알림

예를 들어 3개의 이벤트 알림이 생성됩니다. 모든 이벤트 알림에서 FOR ALTER_TABLE, WITH FAN_IN, 동일한 TO SERVICE 절을 지정하며 같은 SID로 생성됩니다. ALTER TABLE 문을 실행하면 이러한 3개 이벤트 알림에 의해 생성된 메시지가 하나로 병합됩니다. 따라서 대상 서비스는 하나의 이벤트 메시지만 받게 됩니다.

event_type
이벤트 알림을 실행하게 하는 이벤트 유형의 이름입니다. event_type은 Transact-SQL DDL 이벤트 유형, SQL 추적 이벤트 유형 또는 Service Broker 이벤트 유형이 될 수 있습니다. 한정 Transact-SQL DDL 이벤트 유형의 목록은 DDL 이벤트를 참조하세요. Service Broker 이벤트 유형은 QUEUE_ACTIVATION 및 BROKER_QUEUE_DISABLED입니다. 자세한 내용은 Event Notifications을 참조하세요.

event_group
Transact-SQL 또는 SQL 추적 이벤트 유형의 미리 정의된 그룹 이름입니다. 이벤트 그룹에 속해 있는 이벤트를 실행한 후 이벤트 알림이 발생할 수 있습니다. DDL 이벤트 그룹, 이 그룹에 속한 Transact-SQL 이벤트, 이 그룹을 정의할 수 있는 범위의 목록은 DDL 이벤트 그룹을 참조하세요.

또한 event_group은 CREATE EVENT NOTIFICATION 문이 완료될 때 해당 그룹에 속한 이벤트 유형을 sys.events 카탈로그 뷰에 추가하여 매크로의 역할도 합니다.

' broker_service '
이벤트 인스턴스 데이터를 받는 대상 서비스를 지정합니다. SQL Server는 이벤트 알림에 대한 대상 서비스에 대해 하나 이상의 대화를 엽니다. 이 서비스는 메시지를 보내는 데 사용하는 동일 SQL Server 이벤트 메시지 유형 및 계약을 인식해야 합니다.

이벤트 알림이 삭제될 때까지 대화는 열려 있습니다. 특정 오류로 인해 대화가 일찍 닫힐 수 있습니다. 일부 또는 전체 대화를 명시적으로 종료하면 대상 서비스가 더 이상 메시지를 받지 못할 수 있습니다.

{ 'broker_instance_specifier' | 'current database' }
broker_service가 확인되는 Service Broker 인스턴스를 지정합니다. sys.databases 카탈로그 뷰의 service_broker_guid 열을 쿼리하면 특정 Service Broker 값을 얻을 수 있습니다. 현재 데이터베이스의 Service Broker 인스턴스를 지정하려면 'current database'를 사용합니다. 'current database'는 대/소문자를 구분하지 않는 문자열 리터럴입니다.

참고

포함된 데이터베이스에서는 이 옵션을 사용할 수 없습니다.

설명

Service Broker에는 이벤트 알림용 메시지 유형과 계약이 포함되어 있습니다. 따라서 다음과 같은 계약 이름을 지정하는 Service Broker가 이미 있으므로 Service Broker 시작 서비스를 생성하지 않아도 됩니다. https://schemas.microsoft.com/SQL/Notifications/PostEventNotification

이벤트 알림을 받는 대상 서비스는 이러한 기존 계약을 인식해야 합니다.

중요

Service Broker 대화 보안을 구성해야 합니다. 대화 보안은 전체 보안 모델에 따라 수동으로 구성해야 합니다. 자세한 내용은 이벤트 알림에 대한 대화 보안 구성을 참조하세요.

알림을 활성화하는 이벤트 트랜잭션이 롤백되면 이벤트 알림을 보내는 작업도 롤백됩니다. 트랜잭션이 트리거 내부에서 커밋 또는 롤백되는 경우 트리거에 정의된 동작에 대해서는 이벤트 알림이 발생하지 않습니다. 추적 이벤트는 트랜잭션에 의해 바운드되지 않으므로 추적 이벤트 기반 이벤트 알림은 해당 알림을 활성화하는 트랜잭션의 롤백 여부와 관계없이 전송됩니다.

이벤트 알림이 발생한 이후에 서버와 대상 서비스 간의 대화가 중단되면 오류가 보고되고 이벤트 알림은 삭제됩니다.

해당 알림을 최초로 시작한 이벤트 트랜잭션은 이벤트 알림 보내기 작업의 성공 또는 실패에 영향을 받지 않습니다.

이벤트 알림 보내기 실패는 모두 기록됩니다.

사용 권한

데이터베이스(ON DATABASE)에 한정되는 이벤트 알림을 생성하려면 현재 데이터베이스에 대해 CREATE DATABASE DDL EVENT NOTIFICATION 권한이 필요합니다.

DDL 문에서 서버(ON SERVER)에 한정되는 이벤트 알림을 생성하려면 해당 서버에 대해 CREATE DDL EVENT NOTIFICATION 권한이 필요합니다.

추적 이벤트에서 이벤트 알림을 생성하려면 해당 서버에 대해 CREATE TRACE EVENT NOTIFICATION 권한이 필요합니다.

큐에 한정되는 이벤트 알림을 생성하려면 해당 큐에 대해 ALTER 권한이 필요합니다.

예제

참고

다음의 예 1과 예 2에서 TO SERVICE 'NotifyService' 절의 GUID('8140a771-3c4b-4479-8ac0-81008ab17984')는 예가 구성된 컴퓨터에만 해당됩니다. 이 경우 AdventureWorks2022 데이터베이스의 GUID였습니다.

이러한 예를 복사하고 실행하려면 이 GUID를 사용자의 컴퓨터 및 SQL Server 인스턴스에 맞게 바꿔야 합니다. 위의 인수 섹션에서 설명한 것처럼 sys.databases 카탈로그 뷰의 service_broker_guid 열을 쿼리하면 'broker_instance_specifier'를 얻을 수 있습니다.

A. 서버에 한정되는 이벤트 알림 생성

다음 예에서는 Service Broker를 사용하여 대상 서비스를 설정하는 데 필요한 개체를 만듭니다. 대상 서비스는 이벤트 알림용 시작 서비스의 메시지 유형과 계약을 참조합니다. 그러면 SQL Server의 인스턴스에서 Object_Created 추적 이벤트가 발생할 때마다 알림을 보내는 대상 서비스에서 이벤트 알림이 생성됩니다.

--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. 데이터베이스에 한정되는 이벤트 알림 생성

다음 예에서는 앞의 예와 같은 대상 서비스에서 이벤트 알림을 생성합니다. AdventureWorks2022 샘플 데이터베이스에서 이벤트가 발생한 후 ALTER_TABLE 이벤트 알림이 발생합니다.

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

C. 서버에 한정되는 이벤트 알림에 대한 정보 얻기

다음 예에서는 서버 범위를 사용하여 생성한 이벤트 알림 sys.server_event_notifications에 대한 메타데이터에 대해 log_ddl1 카탈로그 뷰를 쿼리합니다.

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

D. 데이터베이스에 한정되는 이벤트 알림에 대한 정보 얻기

다음 예에서는 데이터베이스 범위를 사용하여 생성한 이벤트 알림 sys.event_notifications에 대한 메타데이터에 대해 Notify_ALTER_T1 카탈로그 뷰를 쿼리합니다.

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

참고 항목

이벤트 알림
DROP EVENT NOTIFICATION(Transact-SQL)
EVENTDATA(Transact-SQL)
sys.event_notifications(Transact-SQL)
sys.server_event_notifications(Transact-SQL)
sys.events(Transact-SQL)
sys.server_events(Transact-SQL)