CREATE EVENT NOTIFICATION (Transact-SQL)

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

Icono de vínculo a temasConvenciones 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
    Es el nombre de la notificación de eventos. El nombre de una notificación de eventos debe cumplir las reglas para identificadores y debe ser único dentro del ámbito en el que se creó: SERVER, DATABASE o 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 activa cada vez que el evento especificado en la cláusula FOR se produce en cualquier lugar de la instancia de SQL Server.

  • DATABASE
    Aplica el ámbito de la notificación de eventos a la base de datos actual. Si se especifica, la notificación se activa cada vez que el evento especificado en la cláusula FOR 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. Se puede especificar QUEUE sólo si también se especifica FOR QUEUE_ACTIVATION o FOR BROKER_QUEUE_DISABLED.

  • queue_name
    Es el nombre de la cola a la que se aplica la notificación de eventos. Sólo se puede especificar queue_name si se ha establecido QUEUE.

  • WITH FAN_IN
    Indica a SQL Server que sólo 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 evento especifican FOR ALTER_TABLE, WITH FAN_IN, la misma cláusula TO SERVICE y se crean con el mismo SID. Cuando se ejecuta una instrucción ALTER TABLE, los mensajes que crean estas tres notificaciones de evento se mezclan en uno solo. Por tanto, el servicio de destino recibe un solo mensaje del evento.

  • event_type
    Es el nombre del tipo de evento que ejecuta la notificación de eventos. event_type puede ser un tipo de evento DDL de Transact-SQL, un tipo de evento de Traza 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. Para obtener una lista de los tipos de evento de Traza de SQL válidos, vea Usar eventos de traza con notificaciones de eventos. Los tipos de evento de Service Broker son QUEUE_ACTIVATION y BROKER_QUEUE_DISABLED. Para obtener más información, vea Diseñar notificaciones de eventos.

  • event_group
    Es el nombre de un grupo predefinido de tipos de evento de Transact-SQL o de Traza 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. Para obtener una lista de grupos de eventos de traza y los eventos de traza que cubren, vea Grupos de eventos de traza para el uso con notificaciones de eventos.

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

  • '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. Para obtener más información, vea Crear servicios de Service Broker.

    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' | 'current database' }
    Especifica una instancia de Service Broker en la que se resuelve broker_service. Se puede adquirir el valor de un Service Broker específico al realizar una consulta en la columna service_broker_guid de la vista de catálogo sys.databases. Utilice '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.

Comentarios

Service Broker incluye un tipo de mensaje y un contrato específicos para notificaciones de evento. Por lo tanto, no se debe crear un servicio de inicio de Service Broker debido a que ya existe uno que especifica el nombre de contrato siguiente: https://schemas.microsoft.com/SQL/Notifications/PostEventNotification.

El servicio de destino que recibe notificaciones de eventos debe respetar este contrato preexistente. Para obtener más información acerca de cómo crear servicios de destino de Service Broker, vea Ventajas de programar con Service Broker.

Nota importanteImportante

Se debe configurar la seguridad del diálogo de Service Broker para las notificaciones de evento que envían 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, vea 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 son activadas por una acción definida en un desencadenador cuando se confirma o revierte la transacción en el desencadenador. Dado que los eventos de traza no están enlazados mediante transacciones, se envían las notificaciones de eventos basadas en los eventos de traza, independientemente de si se revierte la transacción que los activa.

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.

Tanto si se envía la notificación de eventos como si no, la notificación de eventos que originalmente inició la notificación no se ve afectada.

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 en el ámbito de la base de datos (ON DATABASE), se requiere el permiso CREATE DATABASE DDL EVENT NOTIFICATION en la base de datos actual.

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

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

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

Ejemplos

Nota

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

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

A. Crear una notificación de eventos en el ámbito de un 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 traza 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
([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. Crear una notificación de eventos en el ámbito de una 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 eventos se activa después de un evento ALTER_TABLE en la base de datos de ejemplo AdventureWorks2008R2.

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 en el ámbito de un 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 en el ámbito de una 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'