Ich möchte erzwingen, dass die von SQLCLR verwendete AppDomain zurückgesetzt wird. Wie kann ich das tun, außer die SQL Server-Instanz neu zu starten?
Ich möchte erzwingen, dass die von SQLCLR verwendete AppDomain zurückgesetzt wird. Wie kann ich das tun, außer die SQL Server-Instanz neu zu starten?
Antworten:
Ich weiß, dass dies ein bisschen brutal ist, aber was ist mit dem Deaktivieren und erneuten Aktivieren der CLR?
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
Weitergabe per Protokollversand, bei der die App-Domain nicht neu geladen (oder zumindest entladen) wurde, der Fehler war. In beiden Fällen habe ich eine noch einfachere Methode gefunden, die ich hier zu meiner Antwort hinzugefügt habe. Wenn Sie die Möglichkeit hätten, diese neue Methode zu testen, wäre das großartig, da ich sehr gespannt bin, ob sie in dem von Ihnen beschriebenen Protokollversand-Szenario funktioniert.
Es gibt eine elegantere Lösung, die nicht alle anderen Assemblys betrifft: Ändern Sie einfach das PERMISSION_SET einer der Assemblys in der App-Domäne (App-Domänen sind pro Benutzer).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Denken Sie daran, dass Sie PERMISSION_SET auf den ursprünglichen Wert zurücksetzen müssen. Außerdem müssen Sie auf eine Methode in der Assembly zugreifen, bevor Sie sie durch Ändern von PERMISSION_SET entladen. Das Ändern einer Assembly, die derzeit nicht in eine aktive App-Domäne geladen ist, jedoch eine andere Assembly hat, hat keine Auswirkungen auf die App-Domäne (App-Domänen sind pro DB, pro Benutzer und nicht pro Assembly).
UPDATE
Die oben beschriebene Methode ist der feinkörnigste Ansatz, bei dem nur diese eine App-Domäne entladen wird. Es ist jedoch erforderlich, dass die Baugruppe auf eine der beiden anderen Ebenen eingestellt werden kann. Für Baugruppen, die als gekennzeichnet gekennzeichnet sind, ist SAFE
dies nur möglich
TRUSTWORTHY ON
oder eingestelltEXTERNAL ACCESS ASSEMBLY
die UNSAFE ASSEMBLY
Berechtigung oder die Berechtigung erhaltenIn diesem Fall können Sie die TRUSTWORTHY
Einstellung einfach ändern ON
und dann sofort wieder OFF
zurückkehren. Dadurch werden alle App-Domänen in dieser bestimmten Datenbank entladen :
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Wenn Sie ohnehin nur eine App-Domain in der Datenbank haben (und ich vermute, dass dies in 95% oder mehr der Fälle der Fall ist), haben beide hier beschriebenen Methoden den gleichen Nettoeffekt. In dieser Situation ALTER DATABASE
scheint die Methode einfacher zu sein, da weder ein bestimmter Objektname angegeben werden muss noch das Original bekannt sein muss PERMISSION_SET
.
AUCH, wenn Sie nur eine einzige App-Domäne haben, ist die ALTER DATABASE
Methode einfacher, selbst wenn die Datenbank entweder bereits eingestellt ist TRUSTWORTHY ON
oder Sie die Schlüsselbasis-Anmeldung mit der entsprechenden Berechtigung eingerichtet haben. Wenn Sie eine schlüsselbasierte Anmeldung verwenden, können Sie wie oben erwähnt TRUSTWORTHY
auf ON
und dann OFF
erneut einstellen . Aber wenn Sie bereits TRUSTWORTHY
gesetzt ON
, dann umkehren es einfach und legen Sie es auf OFF
und dann sofort wieder auf ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Süss.