35 votes

Changer la notification avec Sql Server 2008

J'ai une application qui se compose d'une base de données et de plusieurs services. L'un de ces services ajoute des informations à la base de données (déclenché par un utilisateur).

Un autre service interroge périodiquement les bases de données pour les changements et utilise les nouvelles données comme entrée pour le traitement.

Jusqu'à présent, j'utilisais un minuteur configurable qui interroge la base de données toutes les 30 secondes environ. J'ai lu que Sql 2005 propose une notification des changements. Cependant, cette fonctionnalité est obsolète dans Sql 2008.

Quel est le meilleur moyen d'être informé des changements survenus dans la base de données directement dans le code ? Quelles sont les meilleures pratiques ?

18voto

RickNZ Points 12053

Les services de notification ont été dépréciés, mais de toute façon vous ne voulez pas les utiliser.

Vous pourriez envisager des messages de Service Broker dans certains scénarios ; les détails dépendent de votre application.

Dans la plupart des cas, vous pouvez probablement utiliser SqlDependency ou SqlCacheDependency. La façon dont ils fonctionnent est que vous incluez un objet SqlDependency avec votre requête lorsque vous l'émettez. La requête peut être un simple SELECT ou un groupe complexe de commandes dans une procédure stockée.

Plus tard, si un autre serveur web, utilisateur ou page web apporte une modification à la base de données qui pourrait entraîner un changement dans les résultats de la requête précédente, SQL Server enverra une notification à tous les serveurs qui ont enregistré des objets SqlDependency. Vous pouvez soit enregistrer du code à exécuter lorsque ces événements arrivent, soit l'événement peut simplement effacer une entrée dans le Cache.

Bien que vous deviez activer Service Broker pour utiliser SqlDependency, vous n'avez pas besoin d'interagir explicitement avec lui. Cependant, vous pouvez aussi l'utiliser comme un mécanisme alternatif ; pensez-y plutôt comme un système de messagerie persistant qui garantit l'ordre des messages et une livraison unique.

Les détails sur l'utilisation de ces systèmes sont un peu longs pour un message sur un forum. Vous pouvez les rechercher sur Google, ou je fournis également des exemples dans mon livre (Ultra-Fast ASP.NET).

3voto

Cheeso Points 87022

Oui, cet article de blog explique que Notification Services est désormais obsolète, ainsi que les remplacements ou alternatives à envisager pour l'avenir.

Pour vos besoins - être notifié des changements survenus dans la base de données - il semble que vous vouliez utiliser le suivi des modifications de SQL Server. Mais la notification est basée sur le pull - votre application doit interroger la table des changements.

Je n'ai pas réussi à déterminer si SqlDependency continue de fonctionner avec la désuétude des Notification Services.

3voto

Paul Harrington Points 561

Il existe plusieurs façons différentes de suivre les changements dans la base de données : soit par des déclencheurs qui maintiennent des structures temporelles telles que des journaux de rétroaction, des journaux de suivi (également appelés 'tables d'audit') ou en utilisant les installations de suivi des changements dans SQL 2008 comme références dans une autre réponse. Peu importe le mécanisme que vous utilisez, vous avez le problème d'informer votre service développé en interne du changement. Pour cela, vous pouvez utiliser le Service Broker et l'activation basée sur des événements. D'après ce que vous décrivez, il semble que l'application doive attendre un événement de la file d'attente. http://msdn.microsoft.com/en-us/library/ms171581.aspx

Si vous ne souhaitez pas que le service reste en attente et dort sur la file d'attente, vous pouvez étudier la possibilité de faire démarrer le service de manière 'à la demande' en utilisant le mécanisme d'activation externe dans le service broker.

2voto

Nestor Points 6139

Vous pouvez utiliser System.Data.SqlClient.SqlDependency (qui fonctionne avec Service Broker activé) pour vous abonner aux changements dans une table.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X