Compartilhar via


Habilitando notificações de consulta

Os aplicativos que consomem notificações de consulta têm um conjunto comum de requisitos. Sua fonte de dados deve ser configurada corretamente para dar suporte a notificações de consulta SQL e o usuário deve ter as permissões corretas de cliente e servidor.

Para usar as notificações de consulta, você deve:

  • Habilitar as notificações de consulta para seu banco de dados.

  • Verificar se a ID de usuário usada para se conectar ao banco de dados tem as permissões necessárias.

  • Usar um objeto SqlCommand para executar uma instrução SELECT válida com um objeto de notificação associado – seja SqlDependency ou SqlNotificationRequest.

  • Fornecer o código para processar a notificação se os dados que estão sendo monitorados forem alterados.

Requisitos de notificações de consulta

As notificações de consulta são compatíveis apenas com instruções SELECT que atendem a uma lista de requisitos específicos. A tabela a seguir fornece links para a documentação sobre Service Broker e Notificações de Consulta nos docs do SQL Server.

Documentação do SQL Server

Habilitando notificações de consulta para executar código de exemplo

Para habilitar o Service Broker no banco de dados AdventureWorks usando o SQL Server Management Studio, execute a seguinte instrução Transact-SQL:

ALTER DATABASE AdventureWorks SET ENABLE_BROKER;

Para que os exemplos de notificação de consulta sejam executados corretamente, as instruções Transact-SQL a seguir devem ser executadas no servidor de banco de dados.

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

Permissões de notificações de consulta

Os usuários que executam comandos solicitando notificação devem ter a permissão de banco de dados SUBSCRIBE QUERY NOTIFICATIONS no servidor.

O código do lado do cliente que é executado em uma situação de confiança parcial requer o SqlClientPermission.

O código a seguir cria um objeto SqlClientPermission, configurando o PermissionState como Unrestricted. O Demand forçará um SecurityException em tempo de execução se todos os chamadores mais acima na pilha de chamadas não tiverem recebido a permissão.

// 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

Escolhendo um objeto de notificação

A API de notificações de consulta fornece dois objetos para processar notificações: SqlDependency e SqlNotificationRequest. Em geral, a maioria dos aplicativos que não sejam ASP.NET devem usar o objeto SqlDependency. Os aplicativos ASP.NET devem usar o SqlCacheDependency de nível mais alto, que envolve SqlDependency e fornece uma estrutura para administrar os objetos de notificação e cache.

Como usar SqlDependency

Para usar SqlDependency, o Service Broker deverá ser habilitado para o Banco de Dados do SQL Server usado e os usuários devem ter permissões para receber notificações. Os objetos do Service Broker, como a fila de notificação, são predefinidos.

Além disso, o SqlDependency inicia automaticamente um thread de trabalho para processar as notificações à medida que elas são postadas na fila. Ele também analisa a mensagem do Service Broker, expondo as informações como dados de argumento do evento. O SqlDependency deve ser inicializado chamando o método Start para estabelecer uma dependência com o banco de dados. Esse é um método estático que precisa ser chamado apenas uma vez durante a inicialização do aplicativo para cada conexão de banco de dados necessária. O método Stop deve ser chamado na terminação do aplicativo para cada conexão de dependência que foi feita.

Como usar SqlNotificationRequest

Por outro lado, o SqlNotificationRequest exige que você implemente toda a infraestrutura de escuta por conta própria. Além disso, todos os objetos do Service Broker de suporte, como os tipos de fila, serviço e mensagem compatíveis com a fila, devem ser definidos. Essa abordagem manual será útil se o aplicativo exigir mensagens de notificação especiais ou comportamentos de notificação ou se o aplicativo fizer parte de um aplicativo de Service Broker maior.

Confira também