Utilisation de notifications de requêtes
S’applique à : SQL Server
Les notifications de requêtes ont été introduites dans SQL Server 2005 (9.x) et OLE DB Driver pour SQL Server. Basées sur l’infrastructure de Service Broker SQL introduite dans SQL Server 2005 (9.x), les notifications de requêtes permettent aux applications d’être notifiées en cas de modification des données. Cette fonctionnalité est particulièrement utile pour les applications qui fournissent un cache d’informations de base de données, par exemple, une application web, et qui doivent être notifiées en cas de changement des données sources.
Les notifications de requêtes vous permettent de demander une notification dans un délai d'attente spécifié lorsque les données sous-jacentes d'une requête sont modifiées. La demande spécifie les options de notification, notamment le nom du service, le texte du message et la valeur du délai d’attente au serveur. Les notifications sont remises par l’intermédiaire d’une file d’attente Service Broker qui peut être interrogée par les applications pour détecter les notifications disponibles.
La syntaxe de la chaîne des options de notifications de requêtes est :
service=<service-name>[;(local database=<database> | broker instance=<broker instance>)]
Par exemple :
service=mySSBService;local database=mydb
Les abonnements aux notifications survivent au processus qui les démarre. C’est parce qu’une application peut créer un abonnement aux notifications, puis se terminer. L’abonnement reste valide et la notification a lieu si les données changent dans le délai spécifié. Une notification est identifiée par la requête exécutée, les options de notification et le texte du message. Vous pouvez l’annuler en attribuant la valeur 0 au délai d'attente.
Les notifications sont envoyées une seule fois. Pour recevoir une notification continue des modifications de données, créez un nouvel abonnement en réexécutant la requête une fois chaque notification traitée.
Les applications OLE DB Driver pour SQL Server reçoivent généralement des notifications en utilisant la commande Transact-SQL RECEIVE. Cette commande permet de lire les notifications de la file d’attente associée au service spécifié dans les options de notification.
Notes
Les noms de tables doivent être qualifiés dans des requêtes pour lesquelles une notification est requise. Par exemple : dbo.myTable
. Les noms de tables doivent être qualifiés avec des noms en deux parties. L'abonnement n'est pas valide si des noms en trois ou quatre parties sont utilisés.
L'infrastructure de notification repose sur une fonctionnalité de mise en file d'attente introduite dans SQL Server 2005 (9.x). En général, les notifications générées au niveau du serveur sont envoyées par l’intermédiaire de ces files d’attente pour un traitement ultérieur.
Pour utiliser des notifications de requêtes, une file d’attente et un service doivent exister sur le serveur. Vous pouvez créer ces éléments avec la commande Transact-SQL, qui ressemble aux suivantes :
CREATE QUEUE myQueue
CREATE SERVICE myService ON QUEUE myQueue
([https://schemas.microsoft.com/SQL/Notifications/PostQueryNotification])
Notes
Le service doit utiliser le contrat prédéfini, comme indiqué plus haut.
OLE DB Driver pour SQL Server
OLE DB Driver pour SQL Server prend en charge les notifications du consommateur lors de la modification de l’ensemble de lignes. Le consommateur reçoit une notification à chaque phase de la modification de l’ensemble de lignes et à chaque tentative de modification.
Notes
Le passage d’une requête de notifications au serveur avec ICommand::Execute est la seule méthode valide pour s’abonner à des notifications de requête avec OLE DB Driver pour SQL Server.
Jeu de propriétés DBPROPSET_SQLSERVERROWSET
Pour prendre en charge les notifications de requête avec OLE DB, OLE DB Driver pour SQL Server ajoute les nouvelles propriétés suivantes au jeu de propriétés DBPROPSET_SQLSERVERROWSET
.
Nom | Type | Description |
---|---|---|
SSPROP_QP_NOTIFICATION_TIMEOUT | VT_UI4 | Nombre de secondes pendant lesquelles la notification de requête doit rester active. La valeur par défaut est 432 000 secondes (5 jours). La valeur minimale est 1 seconde, et la valeur maximale est 2^31-1 secondes. |
SSPROP_QP_NOTIFICATION_MSGTEXT | VT_BSTR | Texte du message de la notification. Ce texte est défini par l’utilisateur et n’a aucun format prédéfini. Par défaut, la chaîne est vide. Spécifiez un message en utilisant 1 à 2 000 caractères. |
SSPROP_QP_NOTIFICATION_OPTIONS | VT_BSTR | Options de notification de requêtes. Ces options sont spécifiées dans une chaîne avec la syntaxe nom=valeur. L'utilisateur est chargé de créer le service et de lire les notifications de la file d'attente. La valeur par défaut est une chaîne vide. |
L’abonnement aux notifications est toujours validé, que l’instruction ait été exécutée dans une transaction utilisateur ou en mode de validation automatique, ou que la transaction dans laquelle l’instruction a été exécutée ait été validée ou restaurée. La notification du serveur est déclenchée lorsque l'une des conditions de notification non valides suivantes se produit : modification des données sous-jacentes ou du schéma ou expiration du délai d'attente imparti (selon l'opération qui se produit en premier).
Les inscriptions de notification sont supprimées dès qu’elles sont déclenchées. Par conséquent, lorsque l’application reçoit des notifications, elle doit encore s’abonner si vous voulez obtenir d’autres mises à jour.
Une autre connexion ou un autre thread peut vérifier la file d'attente de destination pour les notifications. Par exemple :
WAITFOR (RECEIVE * FROM MyQueue); -- Where MyQueue is the queue name.
Notes
SELECT *
ne supprime pas l’entrée de la file d’attente. Mais RECEIVE * FROM
la supprime. Cela bloque un thread serveur si la file d'attente est vide. S’il existe des entrées de file d’attente au moment de l’appel, elles sont immédiatement retournées. Sinon, l’appel attend qu’une entrée de file d’attente soit créée.
RECEIVE * FROM MyQueue
Cette instruction retourne immédiatement un jeu de résultats vide si la file d'attente est vide. Sinon, elle retourne toutes les notifications de la file d'attente.
Si SSPROP_QP_NOTIFICATION_MSGTEXT
et SSPROP_QP_NOTIFICATION_OPTIONS
sont des valeurs non Null et non vides, l’en-tête TDS des notifications de requêtes qui contient les trois propriétés définies ci-dessus est envoyé au serveur. Cet en-tête est envoyé à chaque exécution de la commande. Si l’une des valeurs est Null (ou vide), l’en-tête n’est pas envoyé, et DB_E_ERRORSOCCURRED
est déclenché (ou DB_S_ERRORSOCCURRED
est déclenché, si les propriétés sont toutes les deux marquées comme facultatives). La valeur d'état est définie sur DBPROPSTATUS_BADVALUE
. La validation se produit dans la phase d'exécution et de préparation. De la même façon, DB_S_ERRORSOCCURED
est déclenché quand les propriétés de notification de requête sont définies pour les connexions sur les versions SQL Server avant SQL Server 2005 (9.x). Dans ce cas, la valeur d’état est DBPROPSTATUS_NOTSUPPORTED
.
Le démarrage d’un abonnement ne garantit pas la remise des futurs messages. De plus, aucun contrôle n’est effectué en termes de validité du nom du service spécifié.
Notes
La préparation des instructions n’entraînera jamais l’initialisation de l’abonnement. Seule l’exécution de l’instruction permet l’initiation. Les notifications de requêtes ne sont pas affectées par l’utilisation des services principaux d’OLE DB.
Pour plus d’informations sur le jeu de propriétés DBPROPSET_SQLSERVERROWSET
, consultez Propriétés et comportements de l'ensemble de lignes.