Ler em inglês

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

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