Usar SqlNotificationRequest para suscribirse a notificaciones de consulta
La suscripción a notificaciones de consulta mediante SqlNotificationRequest requiere la preparación de los objetos subyacentes de Service Broker para que la aplicación pueda solicitar las notificaciones. Una vez solicitada la suscripción, la aplicación supervisa si hay un mensaje de notificación en la cola y reacciona de manera apropiada cuando llega el mensaje.
SQL Server entrega las notificaciones de consulta mediante Service Broker. Un mensaje de notificación de consulta tiene el nombre de tipo de mensaje https://schemas.microsoft.com/SQL/Notifications/QueryNotification. Service Broker valida los mensajes de este tipo como VALID_XML WITH SCHEMA COLLECTION. En el caso de las suscripciones creadas con SqlNotificationRequest, la supervisión de la cola y el procesamiento de los mensajes de notificación son responsabilidad de la aplicación. Por tanto, la utilización de SqlNotificationRequest requiere la implementación de una aplicación externa. En este tema se tratan los pasos específicos necesarios para suscribirse a una notificación de consulta mediante SqlNotificationRequest. Para obtener más información acerca de cómo crear una aplicación para procesar mensajes de notificación de consulta, vea Ventajas de programar con Service Broker.
SqlNotificationRequest debe especificar un servicio para recibir los mensajes de notificación. Para crear un servicio, debe crear una cola para que el servicio pueda utilizarla y, a continuación, crear el servicio. También debe crear una ruta al servicio en la base de datos local.
El Database Engine (Motor de base de datos) utiliza el contrato https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification para enviar mensajes de notificación, de modo que el servicio que cree debe aceptar las conversaciones que siguen a este contrato. En el ejemplo siguiente se crea un servicio llamado WebCacheNotifications que utiliza la cola WebCacheMessages y, a continuación, se crea una ruta al servicio WebCacheNotifications de la base de datos local.
USE AdventureWorks ;
CREATE QUEUE WebSiteCacheMessages ;
CREATE SERVICE WebCacheNotifications
ON QUEUE WebSiteCacheMessages
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification]) ;
CREATE ROUTE
WebCacheMessagesRoute
WITH SERVICE_NAME = 'WebCacheNotifications',
ADDRESS = 'LOCAL' ;
En el contrato https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification se especifica que el iniciador de la conversación puede enviar mensajes del tipo https://schemas.microsoft.com/SQL/Notifications/QueryNotification.
El nombre del servicio en el objeto SqlNotificationRequest es el nombre del servicio de Service Broker. La notificación se crea como un mensaje de Service Broker.
La solicitud de notificación también debe incluir una cadena de mensaje para la solicitud. Cuando el Database Engine (Motor de base de datos) crea una notificación para esta solicitud, el mensaje de notificación incluye dicha cadena de mensaje. El mensaje de notificación es un documento XML. Este documento incluye un elemento Message que almacena la cadena de mensaje incluida en la solicitud de notificación. La aplicación utiliza la cadena de mensaje para identificar la consulta que corresponde a la notificación.
Las suscripciones de notificación se administran mediante una combinación de la consulta y el mensaje. Si la aplicación solicita otra notificación con el mismo mensaje y la misma consulta, el Database Engine (Motor de base de datos) actualizará la suscripción de notificaciones en lugar de crear una nueva suscripción. El mensaje puede ser cualquier cadena. No obstante, tenga en cuenta que el Database Engine (Motor de base de datos) determina si dos mensajes son el mismo. Por tanto, puede que las opciones establecidas para las cadenas de base de datos que no son equivalentes en el programa lo sean en la base de datos. Por ejemplo, el Database Engine (Motor de base de datos) considera que las cadenas cuya única diferencia es el número de espacios iniciales y finales son iguales.
En el ejemplo siguiente se muestra un programa simple que crea una suscripción de notificaciones mediante SqlNotificationRequest:
[Visual Basic]
Option Strict On
Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlClient
Namespace Microsoft.Samples.SqlServer
Module NotificationSampleMain
Public Sub Main()
Try
' Connect to the AdventureWorks database in the default instance
' on this server, using integrated security. If you change this
' connection string, be sure to change the service string below.
Using connection As SqlConnection = _
new SqlConnection("database=AdventureWorks;server=.;" + _
"Integrated Security=SSPI")
connection.Open()
' Define the service to receive the notifications. Update this
' information if you change the connection string.
Dim service As String = _
"WebCacheNotifications"
Dim query As String = _
"SELECT prod.Name, prod.Class, " + _
" prod.ProductNumber " + _
"FROM Production.Product as prod " + _
"WHERE prod.Color = 'Black' "
Dim command As SqlCommand = connection.CreateCommand()
command.CommandText = query
command.Notification = _
new SqlNotificationRequest(Guid.NewGuid().ToString(), _
service, _
Int32.MaxValue)
Dim reader As SqlDataReader = command.ExecuteReader()
' Normally, an application would process the results here.
MsgBox("Registered the notification.")
' Notice that the connection dispose method also
' disposes the commands and readers created from the
' connection.
End Using ' Using connection
' For sample purposes, simply display all exceptions and exit.
Catch e As SqlException
MsgBox("SqlException: " + e.Message + vbCrLf _
+ e.StackTrace )
Catch e As Exception
MsgBox("Exception: " + e.Message + vbCrLf _
+ e.StackTrace )
End Try
End Sub ' Main
End Module 'NotificationSampleMain
End Namespace ' Microsoft.Samples.SqlServer
Una vez ejecutado este código, SQL Server incluye una suscripción a notificaciones de consulta. La suscripción crea una notificación cuando se modifican los datos especificados en la consulta siguiente:
SELECT prod.Name, prod.Class, prod.ProductNumber
FROM Products.Product as prod
WHERE prod.Color = 'Black'
Service Broker entrega los mensajes de notificación al servicio WebCacheNotifications. Puesto que este servicio utiliza la cola WebCacheMessages, los mensajes de notificación aparecen en la misma. Para procesar los mensajes de notificación, la aplicación supervisa la cola WebCacheMessages.
Vea también