Share via


Habilitando notificações de consulta

Baixar ADO.NET

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

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

  • 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 do Service Broker e das notificações de consulta nos Manuais Online do SQL Server.

documentação do SQL Server

Como habilitar notificações de consulta para executar o 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.

using Microsoft.Data.SqlClient;
using System.Security.Permissions;

class Program
{
    static void Main()
    {
    }

    // Code requires directives to
    // System.Security.Permissions and
    // Microsoft.Data.SqlClient

    private bool CanRequestNotifications()
    {
        SqlClientPermission permission =
            new SqlClientPermission(
            PermissionState.Unrestricted);
        try
        {
            permission.Demand();
            return true;
        }
        catch (System.Exception)
        {
            return false;
        }
    }
}

Como escolher um objeto de notificação

A API de notificações de consulta fornece dois objetos para processar notificações: SqlDependency e SqlNotificationRequest.

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, SqlDependency inicia automaticamente um thread de trabalho para processar as notificações conforme 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. Start é 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 mensagem, de fila e de serviço com suporte da 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.

Próximas etapas