다음을 통해 공유


CREATE EVENT NOTIFICATION(Transact-SQL)

적용 대상:SQL ServerAzure 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

이벤트 알림의 이름입니다. 이벤트 알림 이름은 식별자에 대한 규칙을 준수해야 하며 생성SERVERDATABASE되는 범위 내에서 고유해야 합니다. 또는 object_name.

SERVER

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

참고

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

DATABASE

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

QUEUE

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

queue_name

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

FAN_IN와 함께

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

  • 같은 이벤트에서 생성된 이벤트 알림
  • 같은 보안 주체(같은 SID로 식별됨)가 생성한 이벤트 알림
  • 같은 서비스 및 broker_instance_specifier를 지정합니다.
  • WITH FAN_IN을 지정합니다.

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

event_type

이벤트 알림이 실행되도록 하는 이벤트 유형의 이름입니다. event_type은 Transact-SQL DDL 이벤트 유형, SQL 추적 이벤트 유형 또는 Service Broker 이벤트 유형이 될 수 있습니다. 한정 Transact-SQL DDL 이벤트 유형의 목록은 DDL 이벤트를 참조하세요. Service Broker 이벤트 유형은 다음과 같습니다 QUEUE_ACTIVATIONBROKER_QUEUE_DISABLED. 자세한 내용은 이벤트 알림을 참조하세요.

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' | '현재 데이터베이스' }

broker_service가 확인되는 Service Broker 인스턴스를 지정합니다. 카탈로그 뷰의 열을 쿼리하여 특정 서비스 브로커의 service_broker_guidsys.databases 값을 가져올 수 있습니다. 현재 데이터베이스에서 서비스 브로커 인스턴스를 지정하는 데 사용합니다 'current database' . 'current database' 는 대/소문자를 구분하지 않는 문자열 리터럴입니다.

참고

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

설명

Service Broker에는 이벤트 알림용 메시지 유형과 계약이 포함되어 있습니다. 따라서 Service Broker 시작 서비스는 다음 계약 이름을 지정하는 서비스가 이미 있으므로 만들 필요가 없습니다. http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

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

중요

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

알림을 활성화하는 이벤트 트랜잭션이 롤백되면 이벤트 알림을 보내는 작업도 롤백됩니다. 트랜잭션이 트리거 내에서 커밋되거나 롤백될 때 트리거에 정의된 작업으로 이벤트 알림이 실행되지 않습니다. 추적 이벤트는 트랜잭션에 의해 바인딩되지 않으므로 추적 이벤트를 활성화하는 트랜잭션이 롤백되는지 여부에 관계없이 추적 이벤트를 기반으로 하는 이벤트 알림이 전송됩니다.

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

원래 알림을 시작한 이벤트 트랜잭션은 이벤트 알림 전송의 성공 또는 실패의 영향을 받지 않습니다.

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

사용 권한

데이터베이스()ON DATABASE로 범위가 지정된 이벤트 알림을 만들려면 현재 데이터베이스에 대한 권한이 필요합니다 CREATE DATABASE DDL EVENT NOTIFICATION .

서버()ON SERVER로 범위가 지정된 DDL 문에 이벤트 알림을 만들려면 서버에 대한 권한이 필요합니다 CREATE DDL EVENT NOTIFICATION .

추적 이벤트에 대한 이벤트 알림을 만들려면 서버에 대한 권한이 필요합니다 CREATE TRACE EVENT NOTIFICATION .

큐로 범위가 지정된 이벤트 알림을 만들려면 큐에 대한 권한이 필요합니다 ALTER .

예제

참고

예제 A 및 B에서 절(TO SERVICE 'NotifyService')의 GUID 8140a771-3c4b-4479-8ac0-81008ab17984 는 예제가 설정된 컴퓨터와 관련이 있습니다. 그 경우에는 AdventureWorks2025 데이터베이스의 GUID였습니다.

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

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 ([http://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. 데이터베이스 범위가 지정된 이벤트 알림 만들기

다음 예에서는 앞의 예와 같은 대상 서비스에서 이벤트 알림을 생성합니다. 이벤트 알림은 AdventureWorks2025 샘플 데이터베이스에서 이벤트가 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';