Trabalhando com notificações de consulta

Aplica-se a:SQL Server

Baixar o driver do OLE DB

As notificações de consulta foram introduzidas no SQL Server 2005 (9.x) e no Driver do 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 em caso de alteração nos dados. 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.

Ao usar as notificações de consulta, você poderá solicitar notificações em um 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 do tempo limite do servidor. As notificações são entregues através de uma fila do Service Broker na qual os aplicativos podem sondar as notificações disponíveis.

A sintaxe da cadeia de caracteres das opções de notificação de consulta é:

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

Por exemplo:

service=mySSBService;local database=mydb

As assinaturas de notificação permanecem válidas após o encerramento do processo que as iniciou. Isso ocorre porque um aplicativo pode criar uma assinatura de notificação e, depois, ser encerrado. A assinatura permanece válida e a notificação ocorrerá se os dados forem alterados no tempo limite especificado. Uma notificação é identificada pela consulta executada, pelas opções de notificação e pelo texto da mensagem. Você poderá cancelá-la configurando seu valor de tempo limite como zero.

As notificações só são enviadas uma vez. Para que as notificações de alteração de dados sejam contínuas, crie uma assinatura reexecutando a consulta depois que cada notificação for processada.

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

Observação

Os nomes de tabela devem ser qualificados nas consultas para as quais a notificação é requerida. Por exemplo, dbo.myTable. Os nomes de tabela devem ser qualificados com nomes de duas partes. A assinatura é considerada inválida se nomes com três ou quatro partes são usados.

A infraestrutura de notificação baseia-se em um recurso de fila 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 do 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 usar o contrato predefinido, como mostrado acima.

OLE DB Driver for SQL Server

O Driver do OLE DB para SQL Server é compatível com notificações ao consumidor após modificação no 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ção ao servidor com ICommand::Execute é a única maneira válida de assinar notificações de consulta com o OLE DB Driver for SQL Server.

Conjunto de propriedades DBPROPSET_SQLSERVERROWSET

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

Nome Tipo DESCRIÇÃO
SSPROP_QP_NOTIFICATION_TIMEOUT VT_UI4 O número de segundos que a notificação de consulta permanece 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. Esse texto é definido pelo usuário e não tem um formato predefinido.

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

O padrão é uma cadeia de caracteres vazia.

A assinatura de notificação sempre é confirmada. Isso acontecerá quer a instrução tenha sido executada em uma transação de usuário ou em uma confirmação automática, quer a transação na qual a instrução foi executada tenha sido confirmada ou revertida. A notificação do servidor é acionada mediante uma das seguintes condições inválidas de notificação: alteração dos dados subjacentes ou do esquema ou quando o tempo limite expira; a que ocorrer primeiro.

Os registros de notificação são excluídos assim que são disparados. Portanto, em caso de recebimento de notificações, o aplicativo deve realizar uma nova assinatura se você quiser obter mais atualizações.

Outra conexão ou thread pode verificar se há notificações na fila de destino. 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 o faz. Isso irá interromper 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 aguardará até que surja uma entrada na fila.

RECEIVE * FROM MyQueue

Essa instrução retornará imediatamente um conjunto de resultados vazio se a fila estiver vazia. Caso contrário, ela retornará todas as notificações da fila.

Se SSPROP_QP_NOTIFICATION_MSGTEXT e SSPROP_QP_NOTIFICATION_OPTIONS forem não nulos e não vazios, o cabeçalho TDS das notificações de consulta que contém as três propriedades definidas acima será enviado ao servidor. Esse 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 será gerado DB_E_ERRORSOCCURRED (ou DB_S_ERRORSOCCURRED, se ambas as propriedades estiverem marcadas como opcionais). Então, o valor do status será definido como DBPROPSTATUS_BADVALUE. A validação ocorre após executar e preparar. De modo semelhante, DB_S_ERRORSOCCURED será acionado quando as propriedades de notificação da consulta forem definidas para conexões com versões do SQL Server anteriores a SQL Server 2005 (9.x). Nesse caso, o valor de status é DBPROPSTATUS_NOTSUPPORTED.

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

Observação

A preparação de instruções jamais fará com que a assinatura seja iniciada. Somente a execução da instrução somente 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, confira Comportamentos e propriedades do conjunto de linhas.

Confira também

Recursos do Driver do OLE DB para SQL Server