2009-03-02 8 views
0

j'envisage l'accès à un code CLR d'une UDF dans Sql Server 2005.Problèmes avec CLR code sur Sql Server 2005

J'ai entendu des histoires que les exceptions dans le code non gérées lancées CLR peuvent arrêter le serveur.

Il est évident que ma fonction contiendrait un bloc try-catch. Cependant, certaines exceptions (stackoverflow) peuvent ignorer le catch. Est-ce que quelqu'un a un ensemble de lignes directrices qui peuvent éliminer complètement (ou minimiser) le risque que mon code CLR descende le serveur.

+0

"J'ai entendu dire que des exceptions non gérées dans le code CLR pouvaient faire tomber le serveur."Je doute fortement que - obtenu des références? –

+0

Pouvez-vous qualifier le but de votre code CLR s'il vous plaît? –

Répondre

2

exceptions non gérées ont un effet négatif sur SQL Server, mais à quel point dépend de la gravité défavorable de l'exception qui est levée. En règle générale, vous utilisez des régions à exécution contrainte pour indiquer la portée (processus, domaine d'application, thread, etc., etc.) qu'une partie de votre code peut avoir en cas d'échec. SQL Server l'utilise pour déterminer s'il faut simplement abandonner la requête/requête en cours ou aller plus loin dans le cas d'une erreur plus grave.

Il y a un bon article dans le magazine MSDN qui parle de CER, ainsi que la façon dont SQL Server les utilise:

http://msdn.microsoft.com/en-us/magazine/cc163716.aspx#

De plus, voici une liste des meilleures pratiques qui vise spécifiquement vers le développement code CLR pour SQL Server:

http://msdn.microsoft.com/en-us/library/ms228970.aspx#

+0

+1: Quelques bons liens là –

-1

Que fait le code? Je suggère que vous envisagiez d'éviter complètement le risque en atteignant votre objectif sans utiliser d'abord CLR, plutôt que d'utiliser une technologie qui, vous le savez, ajoutera probablement du couplage et de la complexité, et qui sera complètement non portable. Mais je ne peux rien recommander si je ne sais pas que le problème est, ou si vous avez vraiment besoin de CLR.

-2

Je recommande fortement de supprimer la capacité des requêtes qui utilisent les fonctions CLR à aller en parallèle. Votre kilométrage peut varier, mais j'ai trouvé cela se débarrasser de certaines de mes erreurs de moteur SQL.

http://msdn.microsoft.com/en-us/library/ms181714.aspx

WITH(MAXDOP 1) 
-1

exceptions non interceptées dans le code CLR n'apporteraient le serveur. Le code CLR s'exécute dans un domaine d'application distinct et est isolé. Tout ce qui pourrait arriver (et c'est peu probable) est que l'exception abaisse le domaine de l'application et provoque le déchargement du domaine de l'application. Cela le ferait a) soit recharger sur la prochaine requête, soit b) être désactivé jusqu'à ce que le problème soit résolu ou qu'une nouvelle version de l'assembly soit déployée. Au mieux, cet ensemble CLR particulier serait désactivé et les sessions d'appel recevraient des messages d'erreur. Il est extrêmement peu probable qu'un code CLR défectueux fasse tomber une instance de serveur sql entière; Si c'est le cas, je dirais que c'était un bug de Microsoft, pas un bug dans la fonction CLR ou proc stocké.

Le cas le plus probable est que l'exception uncaught .net serait traduite dans un message d'erreur tsql. Tout au plus, la connexion tsql serait terminée; La plupart du temps, cela entraînerait un message d'erreur.

+0

J'ai vu les procédures SQL CLR planter le processus SQL SQL CLR s'exécute dans le processus SQL – mrdenny

+0

Comme je l'ai dit: si cela se produit, c'est un bug de Microsoft, pas un bogue dans la fonction CLR. De même que si tout t/sql fait tomber le processus sql. –