Synchroniser l'access aux variables statiques dans SQL Server SQLCLR

J'ai écrit un assembly qui est embedded dans le server SQL, fournissant des procédures stockées écrites en C #. L'assemblage a une variable statique en lecture seule contenant certaines données de configuration. Ces données sont manipulées via des procédures stockées, qui sont également fournies par l'assemblage. Évidemment, je dois synchroniser l'access à cette variable statique. J'ai essayé d'utiliser

lock(someGuard) { // ... access static configuration } 

dans ma class de configuration. Mais ensuite, je reçois une exception HostProtectionException, me disant que l'assembly doit fonctionner avec une confiance totale pour le faire. Y a-t-il une meilleure façon de faire cela?

Il existe en fait un hack non documenté: décorez la class avec l'atsortingbut ComstackrGenerated . Comme avec toutes les solutions de contournement non documentées, le kilométrage peut varier avec les versions futures.

Vous ne devriez pas avoir besoin de ceci cependant, si la statique est en lecture seule, vous pouvez la déclarer en lecture seule et l'assemblage se déploiera correctement, les statistics en lecture seule sont acceptées dans les assemblages SAFE. Et est vraiment en lecture seule, le verrou est également inutile.

Si vous ne pouvez pas le marquer en lecture seule et enlever le verrou, cela signifie qu'il n'est pas en lecture seule et que vous serez sur le territoire des sables mouvants. Vous pouvez bloquer les travailleurs SQL et avoir des résultats imprévisibles (d'où l'exigence UNSAFE). L'astuce ComstackrGenerated devrait vraiment être utilisée avec beaucoup de soin, onyl si vous comprenez parfaitement les implications. Le fait que vous ayez besoin d'un lock est un indicateur fort que votre code est réellement dangereux par rapport à SQL et à la statique.

Le seul moyen de contourner cette ressortingction est de déployer l'assembly en tant que UNSAFE. Pourtant, datatables partagées statiques sont contre les recommandations:

Le model de programmation pour le code managé dans SQL Server requirejs des fonctions, des procédures et des types qui ne nécessitent pas l'utilisation d'un état détenu lors de plusieurs invocations ou le partage d'état entre plusieurs sessions user. En outre, comme décrit précédemment, la présence d'un état partagé peut provoquer des exceptions critiques qui affectent l'évolutivité et la fiabilité de l'application.

Compte tenu de ces considérations, SQL Server n'autorise pas l'utilisation de variables statiques et de membres de données statiques. Pour les assemblys SAFE et EXTERNAL-ACCESS, SQL Server examine les métadonnées de l'assembly à l'heure CREATE ASSEMBLY et échoue la création de ces assemblys s'il trouve l'utilisation de membres et de variables de données statiques.