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?
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?
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?
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO
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).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
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 si
TRUSTWORTHY ON
, ouEXTERNAL ACCESS ASSEMBLY
ou la UNSAFE ASSEMBLY
permissionDans ce cas, vous pouvez simplement modifier le TRUSTWORTHY
paramètre ON
, puis immédiatement à OFF
nouveau et cela déchargera tous les domaines d'application dans cette base de données particulière:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
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'original PERMISSION_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 sur TRUSTWORTHY 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éfinir TRUSTWORTHY
à ON
puis à OFF
nouveau comme mentionné ci - dessus. Mais si vous l'avez déjà TRUSTWORTHY
défini ON
, inversez-le et définissez-le OFF
, puis revenez immédiatement à ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Sucré.