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 ASSEMBLYWeitergabe 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 SAFEdies nur möglich
TRUSTWORTHY ONoder eingestelltEXTERNAL ACCESS ASSEMBLYdie UNSAFE ASSEMBLYBerechtigung oder die Berechtigung erhaltenIn diesem Fall können Sie die TRUSTWORTHYEinstellung einfach ändern ONund dann sofort wieder OFFzurü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 DATABASEscheint 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 DATABASEMethode einfacher, selbst wenn die Datenbank entweder bereits eingestellt ist TRUSTWORTHY ONoder 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 TRUSTWORTHYauf ONund dann OFFerneut einstellen . Aber wenn Sie bereits TRUSTWORTHYgesetzt ON, dann umkehren es einfach und legen Sie es auf OFFund 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.