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.