Quelle est la meilleure pratique pour appeler un service Web à partir d'un triggersur (SQL Server)

J'ai besoin d'appeler un webservice quand une colonne particulière dans une table change. Je peux gérer la décision de quelle colonne a changé dans l'insertion / mise à jour / suppression mais je ne suis pas sûr de savoir comment appeler le service web.

Le webservice est hors site, nous avons un peu de contrôle sur celui-ci (nous pouvons requestr des changements et get une réponse raisonnablement rapide) mais le service est en cours de développement, tout comme notre code.

La version de SQL Server est 2005.

Mise à jour : une grande partie de la logique métier de cette application se trouve dans la couche SQL. Aucun moyen pour moi de le changer et se plaindre à ce sujet n'est pas un bon usage de mon time. C'est ce que c'est. Souhait qu'il y avait une couche de logique métier mais elle est partiellement dans la couche PRES et partiellement dans la couche SQL. Un triggersur dans la table est l'endroit le plus central.

Ne pas. La surcharge d'un service Web est incompatible avec les cycles de traitement d'exécution d'une database. Sortez-le de la database et (de preference) rendez-le asynchronous – voir les references à "queue / monitor" dans diverses réponses ci-dessous.

Probablement une question en double , aussi.

Demandez au triggersur d'insert une ligne dans une table avec datatables dont le service Web a besoin, puis requestz à un process externe de surveiller cette table et d'appeler le service Web lorsqu'une nouvelle ligne apparaît.

Une fonction CLR peut effectuer une request de service Web et traiter la réponse. Mais dans ce cas, vous pouvez créer une fonction CLR et appeler la fonction quelque part dans vos objects SQL.

Je suggère de faire l'appel de service Web dans une couche supérieure plutôt que le niveau de database. par exemple, la couche d'access aux données dans votre code qui a modifié cette colonne.

La plupart des magasins ferment le port 80 sur la boîte SQL

Aussi un triggersur devrait être méchant et mince et returnne aussi vite que possible, vous ne voulez pas appeler des choses externes à partir d'un triggersur

Vider datatables d'un triggersur dans une autre table, puis écrire un autre process qui vérifie cette table, puis l'appel de service Web

Je voudrais juste réitérer ce qui a déjà été dit. J'ai travaillé dans des situations où cela a été mis en place et c'est un cauchemar.

vous vous refindez avec une database très réactive car les lignes seront verrouillées pendant que le triggersur exécute l'appel au service Web. Ainsi, si le service Web est lent ou si la latence du réseau est élevée, vous aurez des transactions à long terme bloquant les lignes et réduisant la concurrency de votre database.

Le site où j'ai vu cette implémentation a été modifié pour faire la même chose que décrit par l'orignal et l'set de l'application a été considérablement amélioré lorsque la concurrency de la database a été considérablement augmentée.