Je souhaite forcer la réinitialisation de l'AppDomain utilisé par SQLCLR. Comment puis-je faire cela en plus de redémarrer l'instance SQL Server?
sql-server
sql-clr
Justin Dearing
la source
la source
Réponses:
Je sais que c'est un peu brutal, mais qu'en est-il de désactiver le CLR et de le réactiver?
la source
ALTER ASSEMBLY
propagation via l'envoi de journaux qui n'a pas rechargé (ou au moins déchargé) le domaine d'application était le bogue. Quoi qu'il en soit, j'ai trouvé une méthode encore plus simple que j'ai ajoutée à ma réponse ici. Si vous aviez la possibilité de tester cette nouvelle méthode, ce serait formidable car je suis très curieux de voir si cela fonctionne dans le scénario d'envoi de journaux que vous avez décrit.Il existe une solution plus élégante qui n'affectera pas tous les autres assemblys: modifiez simplement le PERMISSION_SET de l'un des assemblys du domaine d'application (les domaines d'application sont par utilisateur).
N'oubliez pas que vous devrez remettre le PERMISSION_SET sur ce qu'il était. De plus, vous devez accéder à une méthode dans l'assembly avant de modifier le PERMISSION_SET pour le décharger; la modification d'un assembly qui n'est pas actuellement chargé dans un domaine d'application actif, mais avec un autre assembly, n'a aucun effet sur le domaine d'application (les domaines d'application sont par base de données, par utilisateur et non par assemblage).
MISE À JOUR
La méthode décrite ci-dessus est l'approche la plus fine où elle ne déchargera qu'un seul domaine d'application. Mais, cela nécessite que l'ensemble puisse être défini sur l'un des deux autres niveaux. Pour les assemblages marqués comme
SAFE
cela ne sera possible que siTRUSTWORTHY ON
, ouEXTERNAL ACCESS ASSEMBLY
ou laUNSAFE ASSEMBLY
permissionDans ce cas, vous pouvez simplement modifier le
TRUSTWORTHY
paramètreON
, puis immédiatement àOFF
nouveau et cela déchargera tous les domaines d'application dans cette base de données particulière:Si vous n'avez de toute façon qu'un seul domaine d'application (et je soupçonne que c'est le cas à 95% ou plus du temps), les deux méthodes décrites ici ont le même effet net. Et dans cette situation, la
ALTER DATABASE
méthode semble plus simple car elle ne nécessite pas de spécifier un nom d'objet particulier ni de savoir ce qu'était l'originalPERMISSION_SET
.AUSSI, si vous ne disposez que d'un seul domaine d'application, la
ALTER DATABASE
méthode est plus simple, même dans le cas où la base de données est déjà définie surTRUSTWORTHY ON
ou que vous avez configuré la connexion à la base de clés avec l'autorisation appropriée. Si vous utilisez un login par clé vous pouvez définirTRUSTWORTHY
àON
puis àOFF
nouveau comme mentionné ci - dessus. Mais si vous l'avez déjàTRUSTWORTHY
définiON
, inversez-le et définissez-leOFF
, puis revenez immédiatement àON
:la source
SELECT * FROM sys.dm_clr_appdomains;
. Sucré.