Compartilhar via


CREATE EVENT NOTIFICATION (Transact-SQL)

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

Ícone de vínculo de tópicoConvenções de sintaxe 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 eventos. O nome de uma notificação de eventos deve estar em conformidade com as regras para identificadores e deve ser exclusivo no escopo em que é criado: SERVER, DATABASE ou object_name.

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

  • DATABASE
    Aplica o escopo da notificação de eventos ao banco de dados atual. Se for especificada, a notificação será acionada sempre que o evento especificado na cláusula FOR ocorrer no banco de dados atual.

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

  • queue_name
    É o nome da fila à qual a notificação de eventos é aplicável. queue_name pode ser especificado somente se QUEUE for especificado.

  • WITH 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).

    • Especificam o mesmo serviço e broker_instance_specifier.

    • Especificam WITH FAN_IN.

    Por exemplo, três notificações de eventos são criadas. Todas as notificações de eventos especificam FOR ALTER_TABLE, WITH FAN_IN, a mesma cláusula TO SERVICE e são criadas pelo mesmo SID. Quando uma instrução ALTER TABLE é executada, as mensagens criadas por essas três notificações de eventos 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 provoca a execução da notificação de eventos. event_type pode ser um tipo de eventos Transact-SQL DDL, um tipo de evento SQL Trace ou um tipo de evento Service Broker. Para obter uma lista dos tipos de evento Transact-SQL DDL qualificados, consulte Eventos DDL. Para obter uma lista dos tipos de evento SQL Trace, consulte Eventos de rastreamento para uso com notificações de eventos. Os tipos de evento Service Broker são QUEUE_ACTIVATION e BROKER_QUEUE_DISABLED. Para obter mais informações, consulte Criando notificações de eventos.

  • event_group
    É o nome de um grupo predefinido de tipos de evento Transact-SQL ou SQL Trace. 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, consulte Grupos de eventos DDL. Para obter uma lista dos grupos de eventos de rastreamento e dos eventos de rastreamento abrangidos, consulte Grupos de eventos de rastreamento para uso com notificações de eventos.

    event_group também age como uma macro, quando a instrução CREATE EVENT NOTIFICATION termina, com a adição dos tipos de evento abrangidos à exibição do catálogo sys.events.

  • 'broker_service'
    Especifica o serviço de destino que recebe os dados da instância de eventos. O SQL Server abre uma ou mais conversações com o serviço de destino para a notificação de eventos. Esse serviço deve honrar o mesmo tipo de mensagem SQL Server Events e contrato usados para enviar a mensagem. Para obter mais informações, consulte Criando serviços do Service Broker.

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

  • { 'broker_instance_specifier' | 'banco de dados atual' }
    Especifica uma instância do Agente de Serviços na qual broker_service está resolvido. O valor para um agente de serviços específico pode ser adquirido ao consultar a coluna service_broker_guid da exibição do catálogo sys.databases. Use “banco de dados atual” para especificar a instância do Agente de Serviços no banco de dados atual. “banco de dados atual” é um literal de cadeia de caracteres que não diferencia maiúsculas de minúsculas.

Comentários

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

O serviço de destino que recebe as notificações de eventos deve honrar esse contrato preexistente. Para obter mais informações sobre como criar serviços de destino do Service Broker, consulte Benefícios de programar com o Service Broker.

Observação importanteImportante

A segurança de caixa de diálogo do Service Broker 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, consulte Segurança de diálogo para notificações de eventos.

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 eventos não são acionadas por uma ação definida em um gatilho quando a transação é confirmada ou revertida no gatilho. Como os eventos de rastreamento não são associados por transações, as notificações de eventos baseadas nos eventos de rastreamentos são enviadas independentemente de a transação que as acionou estar revertida.

Se a conversação 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 eventos que iniciou originalmente a notificação não é afetada pelo êxito ou pela falha do envio da notificação de eventos.

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

Permissões

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

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

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

Para criar uma notificação de eventos com escopo em uma fila, requer a permissão ALTER na fila.

Exemplos

ObservaçãoObservação

Nos exemplos A e B abaixo, o GUID na cláusula TO SERVICE 'NotifyService' ('8140a771-3c4b-4479-8ac0-81008ab17984') é específico do computador no qual o exemplo foi configurado. Para essa instância, esse era o GUID para o banco de dados AdventureWorks.

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 acima, você pode adquirir 'broker_instance_specifier' consultando a coluna service_broker_guid da exibição do catálogo sys.databases.

A. Criando uma notificação de eventos com escopo no 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. Em seguida, uma notificação de eventos é criada nesse serviço de destino e envia uma notificação sempre que um evento de rastreamento Object_Created 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
([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. Criando uma notificação de eventos com escopo no 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 eventos é acionada depois que um evento ALTER_TABLE ocorre no banco de dados AdventureWorks de amostra.

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

C. Obtendo informações sobre uma notificação de eventos com escopo no 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. Obtendo informações sobre uma notificação de eventos com escopo no 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'