2016-03-10 1 views
0

Je souhaite appeler un CLR dans une procédure de banque activée par la file d'attente de service broker, mais cela entraîne la désactivation de la file d'attente - POISON_MESSAGE_HANDLING (STATUS = ON).Procédure stockée CLR activée par une file d'attente de courtier à publier sur un service Web

Fondamentalement, le CLR appelle simplement un webservice pour publier les données qu'il reçoit.

Y at-il une permission ou quelque chose que je dois faire en premier?

+0

Votre procédure stockée SQLCLR fonctionne-t-elle lorsqu'elle est appelée en dehors du processus Service Broker? Est-ce signé? Avez-vous créé la clé asymétrique à partir de l'assemblage et la connexion à partir de la clé asymétrique, puis octroyez-vous l'autorisation «EXTERNAL ACCESS ASSEMBLY»? Y at-il des messages d'erreur? –

+0

@srutzky - Oui, le SQLCRL fonctionne en dehors du processus Service Broker mais n'est pas signé. Ai-je besoin de le faire signer pour que cela fonctionne? –

+0

Qu'il répare le problème ou non, c'est le moyen le plus préféré de permettre l'accès externe par le code SQLCLR. Je commencerais par signer, en créant la clé, puis la connexion, et en accordant la permission. Ensuite, désactivez TRUSTWORTHY pour cette base de données. Ensuite, essayez à nouveau et si cela ne fonctionne pas, essayez d'obtenir un message d'erreur. Vous devrez peut-être accorder EXECUTE sur la procédure stockée SQLCLR à la connexion à Service Broker. –

Répondre

1

The activated proc '[dbo].[ProcessOrders]' running on queue 'App01.dbo.InstTargetQueue' output the following: 'Could not find stored procedure 'dbo.ProcessOrders

Cette erreur indique que la file d'attente est configurée avec une procédure stockée qui a été supprimée de la base de données, peut-être. Pouvez-vous vérifier que la procédure existe? Peut-être que vous avez une faute de frappe, par exemple. un espace supplémentaire, dans la configuration de la file d'attente? Exécutez select * from sys.service_queues et vérifiez que le nom de la procédure activée est exactement ce que vous attendez. Exécutez select * from sys.procedures et assurez-vous que la procédure existe et qu'elle est nommée comme prévu.

Pour répondre à votre question sur le CLR, je vous invite avant tout à déplacer les appels de service web en dehors de la base de données. Surveillez la file d'attente avec un service de processus externe et publiez l'appel de service Web depuis votre processus, et non depuis l'intérieur de la base de données.

Si vous insistez pour appeler webservices de SQLCLR, alors c'est ce que vous devez savoir:

  • procédures CLR exigent EXTERNAL_ACCESS sur l'ensemble pour être autorisé à appeler des services Web
  • procédures activées fonctionnent dans un « exécuter comme » environnement sandbox, voir Why does feature … not work under activation?
  • L'environnement sandbox empêche EXTERNAL_ACCESS

vous devez quitter e L'environnement sandbox de la procédure activée, et cela peut être fait soit en marquant la base de données comme TRUSTWORTHY, soit en signant la procédure, voir Signing an activated procedure. Mais maintenant votre problème semble être une simple discordance de nom. Si vous conservez vos services Web à l'intérieur de SQLCLR (et je déconseille fortement cela), veuillez lire à propos de Thread.BeginThreadAffinity() et ServicePointManager.DefaultConnectionLimit (le second s'applique également à un processus externe, pas seulement à SQLCLR).

+0

J'ai la procédure de magasin signé avec le nom correct, mais je continue à obtenir cette erreur dans les journaux du serveur. Immédiatement, j'ai créé la base de données TRUSTWORTHY - elle a commencé à fonctionner! bizarre. En outre, j'ai d'abord essayé l'EA, mais pour des raisons, n'a pas été assez rapide pour pousser les données http://stackoverflow.com/questions/35804220/microsoft-service-broker-external-activator-perfomance –