Compartilhar via


CRIAR NOTIFICAÇÃO DE EVENTO (Transact-SQL)

Aplica-se a:SQL ServerInstância Gerenciada de SQL do Azure

Cria um objeto que envia informações sobre um evento de banco de dados ou servidor para um serviço do Service Broker. As notificações de evento são criadas somente com instruções Transact-SQL.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

event_notification_name

O nome da notificação de evento. Um nome de notificação de evento deve estar em conformidade com as regras para identificadores e deve ser exclusivo dentro do escopo no qual eles são criados: SERVERou DATABASEobject_name.

SERVER

Aplica o escopo da notificação de eventos à instância atual do SQL Server. Se especificado, a notificação é acionada sempre que o evento especificado na FOR cláusula ocorre em qualquer lugar na instância do SQL Server.

Observação

Essa opção não está disponível em um banco de dados independente.

DATABASE

Aplica o escopo da notificação de eventos ao banco de dados atual. Se especificado, a notificação é acionada sempre que o evento especificado na FOR cláusula ocorre no banco de dados atual.

QUEUE

Aplica o escopo da notificação em uma fila específica no banco de dados atual. QUEUE só poderá ser especificado se FOR QUEUE_ACTIVATION ou FOR BROKER_QUEUE_DISABLED também for especificado.

queue_name

O nome da fila à qual a notificação de evento se aplica. queue_name só poderá ser especificado se QUEUE for especificado.

COM FAN_IN

Instrui o SQL Server a enviar somente uma mensagem por evento para qualquer serviço especificado para todas as notificações de eventos que:

  • São criadas no mesmo evento.
  • São criadas pelo mesmo principal (conforme identificado pelo mesmo SID).
  • Especifique o mesmo serviço e broker_instance_specifier.
  • Especifique WITH FAN_IN.

Por exemplo, três notificações de eventos são criadas. Todas as notificações de evento especificam FOR ALTER_TABLE, WITH FAN_INa mesma TO SERVICE cláusula, e são criadas pelo mesmo SID. Quando uma instrução ALTER TABLE é executada, as mensagens criadas por essas três notificações de evento são mescladas em uma. Portanto, o serviço de destino recebe só uma mensagem do evento.

event_type

O nome de um tipo de evento que faz com que a notificação de evento seja executada. event_type pode ser um tipo de evento DDL Transact-SQL, um tipo de evento de Rastreamento do SQL ou um tipo de evento Service Broker. Para obter uma lista dos tipos de evento DDL Transact-SQL qualificados, confira DDL Events. Os tipos de eventos do Service Broker são QUEUE_ACTIVATION e BROKER_QUEUE_DISABLED. Para obter mais informações, consulte Notificações de evento.

event_group

O nome de um grupo predefinido de tipos de evento de rastreamento de Transact-SQL ou SQL. Uma notificação de eventos pode ser acionada depois da execução de qualquer evento que pertence a um grupo de eventos. Para obter uma lista dos grupos de eventos DDL, os eventos Transact-SQL abrangidos por eles e o escopo em que podem ser definidos, confira DDL Event Groups.

event_group também atua como uma macro, quando a CREATE EVENT NOTIFICATION instrução é concluída, adicionando os tipos de evento que ela aborda à exibição de sys.events catálogo.

'broker_service'

Especifica o serviço de destino que recebe os dados da instância de eventos. O SQL Server abre uma ou mais conversas com o serviço de destino para a notificação de eventos. Esse serviço deve respeitar o mesmo tipo de mensagem de eventos do SQL Server e o contrato usados para enviar a mensagem.

As conversas permanecem abertas até que a notificação de eventos seja descartada. Alguns erros podem fazer as conversas fecharem antes. O encerramento explícito de algumas ou todas as conversas pode impedir que o serviço de destino receba mais mensagens.

{ 'broker_instance_specifier' | 'banco de dados atual' }

Especifica uma instância do Service Broker na qual broker_service é resolvido. O valor de um agente de serviço específico pode ser adquirido consultando a service_broker_guid coluna da exibição de sys.databases catálogo. Use 'current database' para especificar a instância do service broker no banco de dados atual. 'current database' é um literal de cadeia de caracteres que não diferencia maiúsculas de minúsculas.

Observação

Essa opção não está disponível em um banco de dados independente.

Comentários

O Service Broker inclui um tipo de mensagem e contrato específicos para notificações de eventos. Portanto, um serviço de iniciação do Service Broker não precisa ser criado porque já existe um que especifica o seguinte nome do contrato: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

O serviço de destino que recebe as notificações de eventos deve honrar esse contrato preexistente.

Importante

Agente de Serviço deve ser configurada para notificações de eventos que enviam mensagens a um agente de serviços em um servidor remoto. A segurança de caixa de diálogo deve ser configurada manualmente, de acordo com o modelo de segurança completo. Para obter mais informações, veja Configurar a segurança de diálogo para notificações de evento.

Se uma transação de eventos que ativa uma notificação for revertida, o envio da notificação de eventos também será revertido. As notificações de evento não são disparadas por uma ação definida em um gatilho quando a transação é confirmada ou revertida dentro do gatilho. Como os eventos de rastreamento não são associados por transações, as notificações de evento com base em eventos de rastreamento são enviadas independentemente de a transação que os ativa ser revertida.

Se a conversa entre o servidor e o serviço de destino for quebrada após o acionamento de uma notificação de eventos, um erro será relatado e a notificação de eventos será descartada.

A transação de evento que iniciou a notificação originalmente não é afetada pelo êxito ou falha do envio da notificação de evento.

Qualquer falha de envio de uma notificação de eventos é registrada.

Permissões

Para criar uma notificação de evento com escopo para o banco de dados (ON DATABASE), requer CREATE DATABASE DDL EVENT NOTIFICATION permissão no banco de dados atual.

Para criar uma notificação de evento em uma instrução DDL com escopo para o servidor (ON SERVER), requer CREATE DDL EVENT NOTIFICATION permissão no servidor.

Para criar uma notificação de evento em um evento de rastreamento, requer CREATE TRACE EVENT NOTIFICATION permissão no servidor.

Para criar uma notificação de evento com escopo para uma fila, requer ALTER permissão na fila.

Exemplos

Observação

Nos exemplos A e B, o GUID na TO SERVICE 'NotifyService' cláusula (8140a771-3c4b-4479-8ac0-81008ab17984) é específico para o computador no qual o exemplo foi configurado. Naquele caso, era o GUID para o banco de dados AdventureWorks2025.

Para copiar e executar esses exemplos, é necessário substituir esse GUID pelo GUID do seu computador e pela instância do SQL Server. Conforme explicado na seção Argumentos , você pode adquirir o 'broker_instance_specifier' consultando a service_broker_guid coluna do modo de exibição de sys.databases catálogo.

a. Criar uma notificação de evento com escopo de servidor

O exemplo a seguir cria os objetos obrigatórios para configurar um serviço de destino usando o Service Broker. O serviço de destino faz referência ao tipo de mensagem e ao contrato do serviço de inicialização específico para notificações de eventos. Uma notificação de evento é criada nesse serviço de destino, que envia uma notificação sempre que um Object_Createdevento de rastreamento acontece na instância do 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 ([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. Criar uma notificação de evento com escopo de banco de dados

O exemplo a seguir cria uma notificação de eventos no mesmo serviço de destino do exemplo anterior. A notificação de evento é acionada após um ALTER_TABLE evento ocorrer no banco de dados de exemplo AdventureWorks2025.

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

C. Obter informações sobre uma notificação de evento com escopo de servidor

O exemplo a seguir consulta a exibição do catálogo sys.server_event_notifications para obter os metadados sobre a notificação de eventos log_ddl1 que foi criada no escopo de servidor.

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

D. Obter informações sobre uma notificação de evento com escopo de banco de dados

O exemplo a seguir consulta a exibição do catálogo sys.event_notifications para obter os metadados sobre a notificação de eventos Notify_ALTER_T1 que foi criada no escopo de banco de dados.

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