Compartilhar via


Usando o SqlNotificationRequest para assinar notificações de consulta

Assinar uma notificação usando o SqlNotificationRequest requer que se preparem os objetos Service Broker subjacentes antes que o aplicativo possa solicitar a notificação. Depois que a assinatura for solicitada, o aplicativo monitorará a fila para obter uma mensagem de notificação e reagirá adequadamente quando a receber.

O SQL Server fornece notificações de consulta por meio do Service Broker. Uma mensagem de notificação de consulta tem o nome de tipo de mensagem https://schemas.microsoft.com/SQL/Notifications/QueryNotification. O Service Broker valida mensagens desse tipo como VALID_XML WITH SCHEMA COLLECTION. Para assinaturas criadas com SqlNotificationRequest, o aplicativo é responsável por monitorar a fila e processar as mensagens de notificação. Portanto, usar SqlNotificationRequest requer a implementação de um aplicativo externo. Este tópico discute as etapas específicas necessárias à assinatura de uma notificação de consulta usando SqlNotificationRequest. Para obter mais informações sobre como criar um aplicativo para processar mensagens de notificação de consulta, consulte Benefícios de programar com o Service Broker.

Um SqlNotificationRequest deve especificar um serviço para receber as mensagens de notificação. Para criar o serviço é necessário gerar uma fila para o serviço usar e depois criar o serviço. É igualmente necessário criar uma rota para o serviço no banco de dados local.

O Mecanismo de Banco de Dados usa o contrato https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification para enviar mensagens de notificação, de modo que o serviço que você criar deverá aceitar conversações segundo esse contrato. O exemplo a seguir gera um serviço denominado WebCacheNotifications que usa a fila WebCacheMessages e depois cria uma rota para o serviço de WebCacheNotifications no banco de dados local.

USE AdventureWorks2008R2 ;

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' ;

O contrato https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification especifica que mensagens do tipo https://schemas.microsoft.com/SQL/Notifications/QueryNotification podem ser enviadas pelo iniciador da conversa.

O nome do serviço no objeto SqlNotificationRequest é o nome do serviço Service Broker. A notificação é criada como uma mensagem do Service Broker.

A solicitação de notificação precisa também conter uma cadeia de caracteres de mensagem para a solicitação. Quando o Mecanismo de Banco de Dados cria uma notificação para essa solicitação, a mensagem de notificação contém essa cadeia de caracteres de mensagem. A mensagem de notificação é um documento XML. Este documento contém um elemento de Mensagem que mantém a cadeia de caracteres de mensagem incluída na solicitação de notificação. O aplicativo usa a cadeia de caracteres de mensagem para identificar a consulta que corresponde à notificação.

As assinaturas de notificação são gerenciadas pelo uso da combinação da consulta com a mensagem. Se o aplicativo solicitar outra notificação com a mesma mensagem e a mesma consulta, o Mecanismo de Banco de Dados atualizará a assinatura da notificação em vez de criar uma nova assinatura. A mensagem pode ser qualquer cadeia de caracteres. Contudo, observe que o Mecanismo de Banco de Dados determina se duas mensagens devem ser iguais. Portanto, as opções definidas para as cadeias de caracteres do banco de dados que não são equivalentes no programa podem ser equivalentes no banco de dados. Por exemplo, o Mecanismo de Banco de Dados considera as cadeias de caracteres que diferem apenas no número de espaços à direita como sendo iguais.

O exemplo a seguir mostra um programa simples que cria uma assinatura de notificação que usa 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 AdventureWorks2008R2 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=AdventureWorks2008R2;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

Depois que esse código for executado, SQL Server contém uma assinatura de notificação de consulta. A assinatura produz uma notificação quando ocorrem alterações nos dados especificados na seguinte consulta:

SELECT prod.Name, prod.Class, prod.ProductNumber
FROM Products.Product as prod
    WHERE prod.Color = 'Black'

O Service Broker entrega as mensagens de notificação ao serviço WebCacheNotifications. Como esse serviço usa a fila WebCacheMessages, as mensagens de notificação aparecem nessa fila. Para processar as mensagens de notificação, o aplicativo monitora a fila WebCacheMessages.