Habilitar notificaciones de consulta

Las aplicaciones que consumen notificaciones de consulta tienen un conjunto común de requisitos. El origen de datos se debe configurar correctamente para que admita notificaciones de consulta SQL y el usuario debe contar con los permisos adecuados en el cliente y el servidor.

Para usar notificaciones de consulta, debe hacer lo siguiente:

  • Habilitar las notificaciones de consulta para la base de datos.

  • Asegurarse de que el identificador de usuario usado para conectarse a la base de datos tiene los permisos necesarios.

  • Usar un objeto SqlCommand para ejecutar una instrucción SELECT válida con un objeto de notificación asociado, ya sea SqlDependency o SqlNotificationRequest.

  • Proporcionar código para procesar la notificación si los datos que se supervisan cambian.

Requisitos de las notificaciones de consulta

Se admiten notificaciones de consultas solo para las instrucciones SELECT que cumplan un listado de requisitos específicos. En la tabla siguiente se proporcionan vínculos a la documentación sobre Service Broker y las notificaciones de consulta de la documentación de SQL Server.

Documentación de SQL Server

Habilitar las notificaciones de consulta para ejecutar código de ejemplo

Para habilitar Service Broker en la base de datos AdventureWorks mediante SQL Server Management Studio, ejecute la siguiente instrucción de Transact-SQL:

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

Para que los ejemplos de notificaciones de consulta se ejecuten correctamente, se deben ejecutar las siguientes instrucciones Transact-SQL en el servidor de base de datos.

CREATE QUEUE ContactChangeMessages;  
  
CREATE SERVICE ContactChangeNotifications  
  ON QUEUE ContactChangeMessages  
([http://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]);  

Permisos de notificaciones de consulta

Los usuarios que ejecutan comandos que solicitan una notificación deben tener el permiso de base de datos SUBSCRIBE QUERY NOTIFICATIONS en el servidor.

El código del lado cliente que se ejecuta en una situación de confianza parcial requiere SqlClientPermission.

El código siguiente crea un objeto SqlClientPermission, estableciendo PermissionState en Unrestricted. Demand forzará a SecurityException en un entorno de ejecución si todos los autores de llamada situados en la parte superior de la pila de llamadas no disponen del permiso.

// Code requires directives to
// System.Security.Permissions and
// System.Data.SqlClient

private bool CanRequestNotifications()
{
    SqlClientPermission permission =
        new SqlClientPermission(
        PermissionState.Unrestricted);
    try
    {
        permission.Demand();
        return true;
    }
    catch (System.Exception)
    {
        return false;
    }
}
' Code requires directives to
' System.Security.Permissions and
' System.Data.SqlClient

Private Function CanRequestNotifications() As Boolean

    Dim permission As New SqlClientPermission( _
      PermissionState.Unrestricted)

    Try
        permission.Demand()
        Return True
    Catch ex As Exception
        Return False
    End Try

End Function

Elección de un objeto de notificación

La API de notificaciones de consulta proporciona dos objetos para procesar notificaciones: SqlDependency y SqlNotificationRequest. En general, la mayoría de las aplicaciones que no son ASP.NET deben utilizar el objeto SqlDependency. Las aplicaciones ASP.NET deben utilizar la SqlCacheDependency de nivel más alto, que abarca SqlDependency y proporciona un marco para administrar los objetos de notificación y de caché.

Uso de SqlDependency

Para usar SqlDependency, Service Broker debe estar habilitado en la base de datos de SQL Server que se vaya a usar y los usuarios deben tener permisos para recibir notificaciones. Los objetos de Service Broker, como la cola de notificación, están predefinidos.

Además, SqlDependency inicia automáticamente un subproceso de trabajo para procesar las notificaciones que se publican en la cola; también analiza el mensaje de Service Broker y expone la información en forma de datos de argumento de evento. SqlDependency se debe inicializar llamando al método Start para establecer una dependencia en la base de datos. Se trata de un método estático al que es necesario llamar solo una vez durante la inicialización de la aplicación para cada conexión de base de datos necesaria. Se debe llamar al método Stop en la finalización de la aplicación para cada conexión de dependencia realizada.

Uso de SqlNotificationRequest

Por el contrario, SqlNotificationRequest requiere que implemente toda la infraestructura de escucha. Además, se deben definir todos los objetos de Service Broker de compatibilidad, como la cola, el servicio y los tipos de mensajes admitidos por la cola. Este enfoque manual es útil si la aplicación requiere mensajes de notificación o comportamientos de notificación especiales, o si la aplicación forma parte de una aplicación Service Broker mayor.

Consulte también