Share via


Habilitación de notificaciones de consultas

Descargar ADO.NET

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 las 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 consultas

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 de Service Broker y las notificaciones de consulta en Libros en pantalla de SQL Server.

SQL Server, documentación

Habilitación de 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 notificación 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á una excepción SecurityException en tiempo de ejecución si todos los autores de llamada situados en la parte superior de la pila de llamadas no disponen del permiso.

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

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

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

Elección de un objeto de notificación

La API de notificaciones de consulta proporciona dos objetos para procesar notificaciones: SqlDependency y SqlNotificationRequest.

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 a medida que se publican en la cola. También analiza el mensaje de Service Broker, y expone la información como datos de argumento de evento. SqlDependency se debe inicializar llamando al método Start para establecer una dependencia en la base de datos. Start es 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 complementarios de Service Broker, como los tipos de cola, servicio y 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.

Pasos siguientes