Partilhar via


Trabalhar com notificações de consulta

Aplica-se a:SQL Server

Baixar driver OLE DB

As notificações de consulta foram introduzidas no SQL Server 2005 (9.x) e no driver OLE DB para SQL Server. Baseadas na infraestrutura do SQL Service Broker introduzida no SQL Server 2005 (9.x), as notificações de consulta permitem que os aplicativos sejam notificados quando os dados forem alterados. Esse recurso é útil para aplicativos que fornecem um cache de informações de um banco de dados, como um aplicativo Web, e precisam ser notificados quando os dados de origem são alterados.

Usando notificações de consulta, você pode solicitar notificações dentro de um período de tempo limite especificado quando os dados subjacentes de uma consulta forem alterados. A solicitação especifica as opções de notificação, que incluem o nome do serviço, o texto da mensagem e o valor de tempo limite para o servidor. As notificações são entregues por meio de uma fila do Service Broker que os aplicativos podem pesquisar notificações disponíveis.

A sintaxe da cadeia de opções de notificações de consulta é:

service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]

Por exemplo:

service=mySSBService;local database=mydb

As assinaturas de notificação sobrevivem ao processo que as inicia. Isso porque um aplicativo pode criar uma assinatura de notificação e, em seguida, terminar. A assinatura permanece válida e a notificação ocorre se os dados forem alterados dentro do período de tempo limite especificado. Uma notificação é identificada pela consulta executada, pelas opções de notificação e pelo texto da mensagem. Você pode cancelá-lo definindo seu valor de tempo limite como zero.

As notificações são enviadas apenas uma vez. Para ser continuamente notificado sobre alterações de dados, crie uma nova assinatura executando novamente a consulta após cada notificação ser processada.

O driver OLE DB para aplicativos do SQL Server normalmente recebe notificações usando o comando Transact-SQL RECEIVE. Ele usa esse comando para ler notificações da fila associada ao serviço especificado nas opções de notificação.

Observação

Os nomes das tabelas devem ser qualificados em consultas para as quais é necessária notificação. Por exemplo, dbo.myTable. Os nomes das tabelas devem ser qualificados com nomes de duas partes. A subscrição é inválida se forem utilizados nomes de três ou quatro partes.

A infraestrutura de notificação é criada com base em um recurso de enfileiramento introduzido no SQL Server 2005 (9.x). Em geral, as notificações geradas no servidor são enviadas através dessas filas, para serem processadas posteriormente.

Para usar notificações de consulta, uma fila e um serviço devem existir no servidor. Esses itens podem ser criados usando o comando Transact-SQL, semelhante aos seguintes:

CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])

Observação

O serviço deve utilizar o contrato pré-definido, como mostrado acima.

Driver OLE DB para SQL Server

O driver OLE DB para SQL Server dá suporte a notificações do consumidor após a modificação do conjunto de linhas. O consumidor recebe uma notificação em cada fase da modificação do conjunto de linhas e em qualquer tentativa de alteração.

Observação

Passar uma consulta de notificações para o servidor com ICommand::Execute é a única maneira válida de se inscrever para notificações de consulta com o driver OLE DB para SQL Server.

DBPROPSET_SQLSERVERROWSET conjunto de propriedades

Para dar suporte a notificações de consulta por meio do OLE DB, o driver OLE DB para SQL Server adiciona as novas propriedades a seguir ao conjunto de propriedades DBPROPSET_SQLSERVERROWSET.

Designação Tipo Descrição
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 O número de segundos que a notificação de consulta deve permanecer ativa.

O padrão é 432.000 segundos (5 dias). O valor mínimo é 1 segundo e o valor máximo é 2^31-1 segundos.
SSPROP_QP_NOTIFICATION_MSGTEXT VT_BSTR O texto da mensagem da notificação. Este texto é definido pelo utilizador e não tem um formato predefinido.

Por padrão, a cadeia de caracteres está vazia. Especifique uma mensagem usando de 1 a 2000 caracteres.
SSPROP_QP_NOTIFICATION_OPTIONS VT_BSTR As opções de notificação de consulta. Essas opções são especificadas em uma cadeia de caracteres com nome=valor sintaxe. O usuário é responsável por criar o serviço e ler as notificações fora da fila.

O padrão é uma cadeia de caracteres vazia.

A subscrição de notificação está sempre comprometida. Isso acontece independentemente de a instrução ser executada em uma transação de usuário ou em confirmação automática ou se a transação na qual a instrução foi executada foi confirmada ou revertida. A notificação do servidor é acionada em qualquer uma das seguintes condições de notificação inválidas: alteração de dados ou esquema subjacentes, ou quando o período de tempo limite é atingido; consoante o que ocorrer primeiro.

Os registros de notificação são excluídos assim que são acionados. Assim, ao receber notificações, o aplicativo deve se inscrever novamente se você quiser obter mais atualizações.

Outra conexão ou thread pode verificar a fila de destino para notificações. Por exemplo:

WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.

Observação

SELECT * não exclui a entrada da fila. No entanto, RECEIVE * FROM sim. Isso interrompe um thread de servidor se a fila estiver vazia. Se houver entradas na fila no momento da chamada, elas serão retornadas imediatamente. Caso contrário, a chamada aguarda até que uma entrada na fila seja feita.

RECEIVE * FROM MyQueue

Esta instrução retorna imediatamente um conjunto de resultados vazio se a fila estiver vazia. Caso contrário, ele retorna todas as notificações de fila.

Se SSPROP_QP_NOTIFICATION_MSGTEXT e SSPROP_QP_NOTIFICATION_OPTIONS não forem nulos e não vazios, o cabeçalho TDS de notificações de consulta que contém as três propriedades definidas acima será enviado para o servidor. Este cabeçalho é enviado com cada execução do comando. Se qualquer um deles for nulo (ou vazio), o cabeçalho não será enviado e DB_E_ERRORSOCCURRED será gerado (ou DB_S_ERRORSOCCURRED será gerado, se as propriedades estiverem marcadas como opcionais). O valor de status é definido como DBPROPSTATUS_BADVALUE. A validação ocorre após a execução e preparação. Da mesma forma, DB_S_ERRORSOCCURRED é gerado quando as propriedades de notificação de consulta são definidas para conexões com versões do SQL Server anteriores ao SQL Server 2005 (9.x). O valor de status, neste caso, é DBPROPSTATUS_NOTSUPPORTED.

Iniciar uma assinatura não garante que mensagens futuras serão entregues com sucesso. Além disso, nenhuma verificação é feita quanto à validade do nome de serviço especificado.

Observação

A preparação de declarações nunca fará com que a subscrição seja iniciada. Somente a execução da instrução alcançará a iniciação. As notificações de consulta não são afetadas pelo uso dos serviços principais do OLE DB.

Para obter mais informações sobre o conjunto de propriedades DBPROPSET_SQLSERVERROWSET, consulte Propriedades e comportamentos do conjunto de linhas.

Ver também

Driver OLE DB do para recursos do SQL Server