Share via


Création d'une requête pour notification

La fonctionnalité de notifications de requêtes est basée sur les mécanismes de détection de modification utilisés par le moteur de base de données pour la maintenance des vues indexées. Les exigences et restrictions relatives aux instructions d'une requête pour notification sont semblables à celles applicables aux vues indexées.

Paramètres de l'option SET

Lorsqu'une instruction SELECT est exécutée sous une requête de notification, les options de la connexion qui soumet la requête doivent être définies comme suit :

  • ANSI_NULLS ON

  • ANSI_PADDING ON

  • ANSI_WARNINGS ON

  • CONCAT_NULL_YIELDS_NULL ON

  • QUOTED_IDENTIFIER ON

  • NUMERIC_ROUNDABORT OFF

  • ARITHABORT ON

Notes

L'affectation de la valeur ON à ANSI_WARNINGS affecte de manière implicite la valeur ON à ARITHABORT lorsque le niveau de compatibilité de la base de données est défini à 90. Si le niveau de compatibilité de la base de données est de 80 ou moins, la valeur ON doit être affectée de manière explicite à l'option ARITHABORT.

L'instruction ne doit pas s'exécuter en niveaux d'isolement READ_UNCOMMITTED ou SNAPSHOT.

Si ces options ou le niveau d'isolement ne sont pas définis de manière appropriée, la notification est déclenchée immédiatement après exécution de l'instruction SELECT. Lorsqu'une notification est active, les options de la connexion qui émet une commande qui provoque le déclenchement d'une notification doivent également être définies comme indiqué. Autrement, la commande échoue avec une erreur Transact-SQL.

Lorsque l'instruction se trouve dans une procédure stockée, les options ANSI_NULLS et QUOTED_IDENTIFIER doivent être définies lors de la création de la procédure stockée. Pour plus d'informations, consultez SET ANSI_NULLS (Transact-SQL) et SET QUOTED_IDENTIFIER (Transact-SQL).

Instructions pour notification

En général, vous pouvez demander une notification pour toute requête qui peut être utilisée pour créer une vue indexée. Vous pouvez définir des notifications pour les instructions suivantes :

  • SELECT

    Pour plus d'informations sur les exigences et les limitations spécifiques à SELECT, consultez la section « Instructions SELECT prises en charge » ci-dessous. Pour plus d'informations sur l'instruction SELECT, consultez SELECT (Transact-SQL).

  • EXECUTE

    Dans ce cas, SQL Server enregistre une notification pour la commande exécutée plutôt que l'instruction EXECUTE elle-même. La commande doit satisfaire les exigences et limitations applicables aux instructions SELECT. Pour plus d'informations sur l'instruction EXECUTE, consultez EXECUTE (Transact-SQL).

Lorsqu'une commande qui enregistre une notification contient plusieurs instructions, le moteur de base de données crée une notification pour chaque instruction du traitement.

Instructions SELECT prises en charge

Les notifications de requêtes sont prises en charge pour les instructions SELECT qui répondent aux exigences suivantes :

  • Les colonnes projetées de l'instruction SELECT doivent être déclarées de manière explicite et les noms des tables doivent être qualifiés avec des noms en deux parties. Notez que cela signifie que toutes les tables auxquelles il est fait référence dans l'instruction doivent être dans la même base de données.

  • L'instruction ne doit pas utiliser l'astérisque (*) ni la syntaxe nom_table.* pour spécifier les colonnes.

  • L'instruction ne doit pas utiliser de colonnes non nommées ni de noms de colonnes dupliqués.

  • L'instruction doit faire référence à une table de base.

  • L'instruction ne doit pas référencer des tables avec des colonnes calculées.

  • Les colonnes projetées de l'instruction SELECT ne doivent pas contenir d'expression d'agrégation, à moins que l'instruction n'utilise une expression GROUP BY. Lorsqu'une expression GROUP BY est fournie, la liste de sélection peut contenir les fonctions d'agrégation COUNT_BIG() ou SUM(). Toutefois, SUM() ne peut pas être spécifiée pour une colonne nullable. L'instruction ne doit pas spécifier HAVING, CUBE ou ROLLUP.

  • Une colonne projetée de l'instruction SELECT qui est utilisée comme expression simple ne doit pas apparaître plus d'une fois.

  • L'instruction ne doit pas inclure d'opérateurs PIVOT ou UNPIVOT.

  • L'instruction ne doit pas inclure d'opérateurs UNION, INTERSECT ou EXCEPT.

  • L'instruction ne doit pas faire référence à une vue.

  • L'instruction ne doit contenir aucun des éléments suivants : DISTINCT, COMPUTE, COMPUTE BY ou INTO.

  • L'instruction ne doit pas faire référence à des variables globales de serveur (@@nom_variable).

  • L'instruction ne doit pas faire référence à des tables dérivées, des tables temporaires ou des variables de table.

  • L'instruction ne doit pas faire référence à des tables ou à des vues d'autres bases de données ou d'autres serveurs.

  • L'instruction ne doit pas contenir de sous-requêtes, de jointures externes ni de jointures réflexives.

  • L'instruction ne doit pas faire référence aux types d'objets volumineux : text, ntext et image.

  • L'instruction ne doit pas utiliser les prédicats de texte intégral CONTAINS et FREETEXT.

  • L'instruction ne doit pas utiliser de fonctions d'ensembles de lignes, y compris OPENROWSET et OPENQUERY.

  • L'instruction ne doit utiliser aucune des fonctions d'agrégation suivantes : AVG, COUNT(*), MAX, MIN, STDEV, STDEVP, VAR ou VARP.

  • L'instruction ne doit utiliser aucune fonction non déterministe, y compris des fonctions de fenêtrage et de classement.

  • L'instruction ne doit pas contenir d'agrégats définis par l'utilisateur.

  • L'instruction ne doit pas faire référence à des tables ou des vues système, y compris des vues catalogue et des vues de gestion dynamique.

  • L'instruction ne doit pas inclure d'informations FOR BROWSE.

  • L'instruction ne doit pas faire référence à une file d'attente.

  • L'instruction ne doit pas contenir d'instructions supplémentaires qui ne peuvent pas changer ni retourner de résultats (par exemple, WHERE 1=0).

  • L'instruction ne peut pas spécifier un indicateur de verrouillage READPAST.

  • L'instruction ne doit référencer aucune file d'attente Service Broker.

  • L'instruction ne doit pas référencer des synonymes.

  • L'instruction ne doit pas être dotée d'une comparaison ou d'une expression basée sur des types de données double/real.

  • L'instruction ne doit pas utiliser l'expression TOP.

Lots et procédures stockées

Si une demande d'abonnement est soumise pour un lot ou une procédure stockée, une demande d'abonnement séparée est soumise pour chaque instruction exécutée dans le lot ou la procédure stockée.

Les instructions EXECUTE n'inscrivent aucune notification mais la demande de notification est transmise à la commande exécutée. S'il s'agit d'un traitement, le contexte est appliqué aux instructions exécutées et les mêmes règles décrites ci-dessus sont appliquées.

Abonnements dupliqués

La soumission d'un double d'abonnement actif entraîne le renouvellement de l'abonnement existant avec la nouvelle valeur de délai d'attente spécifiée. Un abonnement dupliqué doit respecter les conditions suivantes :

  • La requête est soumise par le même utilisateur sous le même contexte de base de données.

  • Les mêmes modèle, valeurs de paramètres, ID de notification et emplacement de remise sont utilisés.

Cela signifie qu'une notification est demandée pour des requêtes identiques ; une seule notification est envoyée. Cette situation concerne une requête dupliquée dans un traitement ou une requête dans une procédure stockée sollicitée plusieurs fois.

Voir aussi

Référence

Concepts