Criando uma consulta para notificação

A funcionalidade de notificações de consulta é baseada nos mecanismos de detecção de alterações que o Mecanismo de Banco de Dados usa para manter exibições indexadas. Os requisitos e as restrições das instruções em uma consulta de notificação são semelhantes aos requisitos e às restrições de uma exibição indexada.

Configurações da opção SET

Quando uma instrução SELECT é executada com base em uma solicitação de notificação, a conexão que envia a solicitação deve ter as opções de conexão definidas como segue:

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

ObservaçãoObservação

A configuração da opção ANSI_WARNINGS como ON definirá implicitamente ARITHABORT como ON quando o nível de compatibilidade do banco de dados estiver definido como 90. Se o nível de compatibilidade do banco de dados for definido como 80 ou abaixo disso, a opção ARITHABORT deverá ser definida explicitamente como ON.

A instrução não deve ser executada sob os níveis de isolamento READ_UNCOMMITTED ou SNAPSHOT.

Se essas opções ou o nível de isolamento não forem definidos de forma adequada, a notificação será acionada imediatamente após a execução da instrução SELECT. Quando uma notificação está ativa, a conexão que emite o comando que aciona a notificação também deve ter as opções SET definidas conforme mostrado. Caso contrário, o comando apresentará o erro Transact-SQL.

Quando a instrução estiver contida em um procedimento armazenado, as opções ANSI_NULLS e QUOTED_IDENTIFIER deverão ser definidas durante a criação do procedimento armazenado. Para obter mais informações, consulte SET ANSI_NULLS (Transact-SQL) e SET QUOTED_IDENTIFIER (Transact-SQL).

Instruções para notificação

Em geral, é possível solicitar notificação para todas as consultas que podem ser usadas para criar uma exibição indexada. Você pode configurar notificações para as seguintes instruções:

  • SELECT

    Para requisitos e limitações específicos de SELECT, consulte "Instruções SELECT com suporte" abaixo. Para obter mais informações sobre a instrução SELECT, consulte SELECT (Transact-SQL).

  • EXECUTE

    Nesse caso, o SQL Server registra uma notificação para o comando executado e não a própria instrução EXECUTE. O comando deve atender os requisitos e as limitações de uma instrução SELECT. Para obter mais informações sobre a instrução EXECUTE, consulte EXECUTE (Transact-SQL).

Quando um comando que registra uma notificação contiver mais de uma instrução, o Mecanismo de Banco de Dados criará uma notificação para cada instrução no lote.

Instruções SELECT com suporte

As notificações de consulta têm suporte para instruções SELECT que atendam os seguintes requisitos:

  • As colunas projetadas na instrução SELECT devem ser declaradas explicitamente e os nomes de tabela devem ser qualificados com nomes de duas partes. Observe que isso significa que todas as tabelas referenciadas na instrução devem estar no mesmo banco de dados.

  • A instrução não pode usar o asterisco (*) nem a sintaxe table_name.* para especificar colunas.

  • A instrução não pode usar colunas sem-nome nem nomes de coluna duplicados.

  • A instrução deve fazer referência a uma tabela base.

  • A instrução não deve fazer referência a tabelas com colunas computadas.

  • As colunas projetadas na instrução SELECT não podem conter expressões agregadas, a menos que a instrução use uma expressão GROUP BY. Quando uma expressão GROUP BY é fornecida, a lista de seleção pode conter as funções de agregação COUNT_BIG() ou SUM(). Porém, a função SUM() não pode ser especificada para uma coluna que permite valor nulo. A instrução não pode especificar HAVING, CUBE ou ROLLUP.

  • Uma coluna projetada na instrução SELECT usada como expressão simples não deve ser exibida mais de uma vez.

  • A instrução não deve incluir operadores PIVOT ou UNPIVOT.

  • A instrução não deve incluir os operadores UNION, INTERSECT ou EXCEPT.

  • A instrução não deve fazer referência a uma exibição.

  • A instrução não deve conter: DISTINCT, COMPUTE ou COMPUTE BY ou INTO.

  • A instrução não deve fazer referência a variáveis globais de servidor (@@variable_name).

  • A instrução não deve fazer referência a tabelas derivadas, tabelas temporárias ou variáveis de tabelas.

  • A instrução não deve fazer referência a tabelas ou exibições de outros bancos de dados ou servidores.

  • A instrução não deve conter subconsultas, junções externas ou autojunções.

  • A instrução não deve fazer referência a tipos de objeto grande: text, ntext e image.

  • A instrução não deve usar os predicados de texto completo CONTAINS ou FREETEXT.

  • A instrução não deve usar funções do conjunto de linhas, inclusive OPENROWSET e OPENQUERY.

  • A instrução não deve usar nenhuma das seguintes funções de agregação: AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR ou VARP.

  • A instrução não deve usar funções não determinísticas, incluindo as funções de classificação e em janela.

  • A instrução não deve conter agregações definidas pelo usuário.

  • A instrução não deve fazer referência a tabelas ou exibições de sistema, inclusive exibições do catálogo e exibições de gerenciamento dinâmico.

  • A instrução não deve incluir informações FOR BROWSE.

  • A instrução não deve fazer referência a uma fila.

  • A instrução não deve conter instruções condicionais que não podem ser alteradas e que não podem retornar resultados (por exemplo, WHERE 1=0).

  • A instrução não pode especificar a dica de bloqueio READPAST.

  • A instrução não deve fazer referência a nenhuma instrução QUEUE do Agente de Serviços.

  • A instrução não deve fazer referência a sinônimos.

  • A instrução não deve conter comparações ou expressões baseadas em tipos de dados duplos/reais.

  • A instrução não deve usar a expressão TOP.

Lotes e procedimentos armazenados

Se uma solicitação de assinatura for feita para um lote ou procedimento armazenado, outra solicitação de assinatura será feita para cada instrução executada no lote ou procedimento armazenado.

As instruções EXECUTE não irão registrar notificações, mas farão a transferência da solicitação de notificação para o comando executado. Se for um lote, o contexto será aplicado às instruções executadas e serão aplicadas as mesmas regras descritas anteriormente.

Assinaturas duplicadas

O envio de uma assinatura ativa duplicada faz com que a assinatura existente seja renovada usando o novo valor de tempo limite especificado. A assinatura duplicada é aquela que atende as seguintes condições:

  • A consulta é enviada pelo mesmo usuário, no mesmo contexto de banco de dados.

  • São usados o mesmo modelo, valores de parâmetro, ID de notificação e local de entrega.

Isso significa que, se uma notificação for solicitada para consultas idênticas, apenas uma notificação será enviada. Isso se aplica a uma consulta duplicada em um lote ou a uma consulta em um procedimento armazenado chamado várias vezes.

Consulte também

Referência

Conceitos