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?
sql-server
sql-clr
Justin Dearing
quelle
quelle
Antworten:
Ich weiß, dass dies ein bisschen brutal ist, aber was ist mit dem Deaktivieren und erneuten Aktivieren der CLR?
quelle
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).
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öglichTRUSTWORTHY ON
oder eingestelltEXTERNAL ACCESS ASSEMBLY
dieUNSAFE ASSEMBLY
Berechtigung oder die Berechtigung erhaltenIn diesem Fall können Sie die
TRUSTWORTHY
Einstellung einfach ändernON
und dann sofort wiederOFF
zurückkehren. Dadurch werden alle App-Domänen in dieser bestimmten Datenbank entladen :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 mussPERMISSION_SET
.AUCH, wenn Sie nur eine einzige App-Domäne haben, ist die
ALTER DATABASE
Methode einfacher, selbst wenn die Datenbank entweder bereits eingestellt istTRUSTWORTHY 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ähntTRUSTWORTHY
aufON
und dannOFF
erneut einstellen . Aber wenn Sie bereitsTRUSTWORTHY
gesetztON
, dann umkehren es einfach und legen Sie es aufOFF
und dann sofort wieder aufON
:quelle
SELECT * FROM sys.dm_clr_appdomains;
. Süss.