Compartir a través de


CREAR NOTIFICACIÓN DE EVENTO (Transact-SQL)

Se aplica a:SQL ServerAzure SQL Managed Instance

Crea un objeto que envía información sobre una base de datos o un evento de servidor a un servicio de Service Broker. Las notificaciones de eventos solo se pueden crear mediante instrucciones Transact-SQL.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Nombre de la notificación de eventos. Un nombre de notificación de evento debe cumplir las reglas de los identificadores y debe ser único dentro del ámbito en el que se crean: SERVER, DATABASEo object_name.

SERVER

Aplica el ámbito de la notificación de eventos a la instancia actual de SQL Server. Si se especifica, la notificación se desencadena cada vez que el evento especificado en la FOR cláusula se produce en cualquier lugar de la instancia de SQL Server.

Nota

Esta opción no está disponible en una base de datos independiente.

DATABASE

Aplica el ámbito de la notificación de eventos a la base de datos actual. Si se especifica, la notificación se desencadena cada vez que el evento especificado en la FOR cláusula se produce en la base de datos actual.

QUEUE

Aplica el ámbito de la notificación a la cola especificada en la base de datos actual. QUEUE solo se puede especificar si FOR QUEUE_ACTIVATION también se especifica o FOR BROKER_QUEUE_DISABLED .

queue_name

Nombre de la cola a la que se aplica la notificación de eventos. queue_name solo se puede especificar si QUEUE se especifica .

CON FAN_IN

Indica a SQL Server que solo envíe un mensaje por evento a un servicio especificado para todas las notificaciones de eventos que:

  • Se crean en el mismo evento.
  • Son creadas por la misma entidad de seguridad (identificada por el mismo SID).
  • Especifica el mismo servicio y broker_instance_specifier.
  • Especifique WITH FAN_IN.

Por ejemplo, se crean tres notificaciones de evento. Todas las notificaciones de eventos especifican FOR ALTER_TABLE, WITH FAN_IN, la misma TO SERVICE cláusula y se crean mediante el mismo SID. Cuando se ejecuta una ALTER TABLE instrucción, los mensajes creados por estas tres notificaciones de eventos se combinan en uno. Por tanto, el servicio de destino recibe un solo mensaje del evento.

event_type

Nombre de un tipo de evento que hace que se ejecute la notificación de eventos. event_type puede ser un tipo de evento DDL de Transact-SQL, un tipo de evento de Seguimiento de SQL o un tipo de evento de Service Broker. Para obtener una lista de tipos de eventos DDL de Transact-SQL posibles, vea Eventos DDL. Los tipos de eventos de Service Broker son QUEUE_ACTIVATION y BROKER_QUEUE_DISABLED. Para obtener más información, consulte Notificaciones de eventos.

event_group

Nombre de un grupo predefinido de Transact-SQL o tipos de eventos de seguimiento de SQL. Se puede activar una notificación de eventos tras la ejecución de cualquier evento que pertenece a un grupo de eventos. Para obtener una lista de grupos de eventos DDL, los eventos de Transact-SQL que cubren y el ámbito en el que se pueden definir, vea Grupos de eventos DDL.

event_group también actúa como una macro, cuando finaliza la CREATE EVENT NOTIFICATION instrucción, agregando los tipos de evento que cubre a la vista de sys.events catálogo.

"broker_service"

Especifica el servicio de destino que recibe los datos de instancia de evento. SQL Server abre una o más conversaciones al servicio de destino para la notificación de eventos. Este servicio debe respetar el mismo contrato y tipo de mensaje de eventos de SQL Server que se utilizan en el envío del mensaje.

Las conversaciones permanecen abiertas hasta que se quita la notificación de eventos. Algunos errores pueden hacer que las conversaciones se cierren antes. Es posible que la finalización de algunas o todas las conversaciones explícitamente evite que el servicio de destino reciba más mensajes.

{ 'broker_instance_specifier' | 'base de datos actual' }

Especifica una instancia de Service Broker en la que se resuelve broker_service. El valor de un agente de servicio específico se puede adquirir consultando la service_broker_guid columna de la sys.databases vista de catálogo. Use 'current database' para especificar la instancia de Service Broker en la base de datos actual. 'current database' es un literal de cadena que no distingue mayúsculas de minúsculas.

Nota

Esta opción no está disponible en una base de datos independiente.

Observaciones

Service Broker incluye un tipo de mensaje y un contrato específicos para notificaciones de evento. Por lo tanto, no es necesario crear un servicio de inicio de Service Broker porque ya existe un que especifica el siguiente nombre de contrato: http://schemas.microsoft.com/SQL/Notifications/PostEventNotification

El servicio de destino que recibe notificaciones de eventos debe respetar este contrato preexistente.

Importante

Service Broker se debe configurar para las notificaciones de eventos que envíen mensajes a un Service Broker en un servidor remoto. La seguridad del diálogo debe configurarse manualmente según el modelo de seguridad completa. Para obtener más información, consulte Configurar la seguridad de diálogo para notificaciones de eventos.

Si se revierte una transacción de evento que activa una notificación, también se revierte el envío de la notificación de eventos. Las notificaciones de eventos no se activan mediante una acción definida en un desencadenador cuando la transacción se confirma o se revierte dentro del desencadenador. Dado que los eventos de seguimiento no están enlazados por transacciones, las notificaciones de eventos basadas en eventos de seguimiento se envían independientemente de si la transacción que las activa se revierte.

Si se interrumpe la conversación entre el servidor y el servicio de destino tras la activación de una notificación de eventos, se informa un error y se quita la notificación de eventos.

La transacción de eventos que inició originalmente la notificación no se ve afectada por el éxito o error del envío de la notificación de eventos.

Se guarda un registro de cualquier error en el envío de una notificación de eventos.

Permisos

Para crear una notificación de eventos cuyo ámbito sea la base de datos (ON DATABASE), requiere CREATE DATABASE DDL EVENT NOTIFICATION permiso en la base de datos actual.

Para crear una notificación de eventos en una instrucción DDL cuyo ámbito es el servidor (ON SERVER), requiere CREATE DDL EVENT NOTIFICATION permiso en el servidor.

Para crear una notificación de eventos en un evento de seguimiento, requiere CREATE TRACE EVENT NOTIFICATION permiso en el servidor.

Para crear una notificación de eventos cuyo ámbito es una cola, requiere ALTER permiso en la cola.

Ejemplos

Nota

En Los ejemplos A y B, el GUID de la TO SERVICE 'NotifyService' cláusula (8140a771-3c4b-4479-8ac0-81008ab17984) es específico del equipo en el que se configuró el ejemplo. En ese caso, era el GUID para la base de datos AdventureWorks2025.

Para copiar y ejecutar estos ejemplos, necesita reemplazar este GUID por uno de su equipo y su instancia de SQL Server. Como se explica en la sección Argumentos , puede adquirir el "broker_instance_specifier" consultando la service_broker_guid columna de la sys.databases vista de catálogo.

A. Creación de una notificación de eventos con ámbito de servidor

En el ejemplo siguiente se crean los objetos necesarios para configurar un servicio de destino utilizando Service Broker. El servicio de destino hace referencia al contrato y tipo de mensaje del servicio de inicio específicamente para notificaciones de eventos. Después, se crea una notificación de eventos en el servicio de destino que envía una notificación cada vez que tiene lugar un evento de seguimiento Object_Created en la instancia de 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. Creación de una notificación de eventos con ámbito de base de datos

El ejemplo siguiente crea una notificación de eventos en el mismo servicio de destino que el ejemplo anterior. La notificación de evento se activa después de que ocurra un ALTER_TABLE evento en la base de datos de ejemplo de AdventureWorks2025.

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

C. Obtener información sobre una notificación de eventos con ámbito de servidor

El ejemplo siguiente realiza una consulta en la vista de catálogo sys.server_event_notifications respecto de metadatos sobre la notificación de eventos log_ddl1 creada en el ámbito de un servidor.

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

D. Obtener información sobre una notificación de eventos con ámbito de base de datos

El ejemplo siguiente realiza una consulta en la vista de catálogo sys.event_notifications respecto de metadatos sobre la notificación de eventos Notify_ALTER_T1 creada en el ámbito de una base de datos.

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