Voglio forzare il ripristino dell'AppDomain utilizzato da SQLCLR. Come posso farlo oltre a riavviare l'istanza di SQL Server?
Voglio forzare il ripristino dell'AppDomain utilizzato da SQLCLR. Come posso farlo oltre a riavviare l'istanza di SQL Server?
Risposte:
So che è un po 'brutale, ma che dire di disabilitare il CLR e riattivarlo?
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
propagazione tramite log shipping che non ha ricaricato (o almeno scaricato) il dominio app era il bug. Ad ogni modo, ho trovato un metodo ancora più semplice che ho aggiunto alla mia risposta qui. Se avessi la possibilità di testare questo nuovo metodo sarebbe fantastico, dato che sono molto curioso di vedere se funziona nello scenario di spedizione dei log che hai descritto.
Esiste una soluzione più elegante che non influirà su tutti gli altri assembly: basta cambiare PERMISSION_SET di uno degli assembly nel dominio dell'app (i domini dell'app sono per utente).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Ricorda solo che dovrai riportare PERMISSION_SET su quello che era. Inoltre, è necessario accedere a un metodo nell'assemblaggio prima di modificare PERMISSION_SET per scaricarlo; la modifica di un assembly che non è attualmente caricato in un dominio di app che è attivo, ma con un altro assembly, non ha alcun effetto sul dominio di app (i domini di app sono per DB, per utente, non per assembly).
AGGIORNAMENTO
Il metodo sopra descritto è l'approccio più dettagliato in cui scaricherà solo un dominio app. Tuttavia, richiede che l'assembly possa essere impostato su uno degli altri due livelli. Per gli assiemi contrassegnati come SAFE
sarà possibile solo se uno dei due
TRUSTWORTHY ON
oEXTERNAL ACCESS ASSEMBLY
l' UNSAFE ASSEMBLY
autorizzazione oIn questo caso puoi semplicemente cambiare l' TRUSTWORTHY
impostazione ON
e poi immediatamente di OFF
nuovo indietro e questo scaricherà tutti i domini app in quel particolare database:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Se hai comunque un solo dominio app nel database (e sospetto che questo sia il caso del 95% o più del tempo), entrambi i metodi qui descritti hanno lo stesso effetto netto. E in quella situazione, il ALTER DATABASE
metodo sembra più semplice in quanto non richiede di specificare un nome di oggetto particolare né di sapere quale fosse l'originale PERMISSION_SET
.
ANCHE, se si dispone di un solo dominio app, il ALTER DATABASE
metodo è più semplice anche nel caso in cui il database sia già impostato TRUSTWORTHY ON
o si sia configurato l'accesso con base di chiavi con l'autorizzazione appropriata. Se si utilizza un accesso basato su chiave, è possibile impostare TRUSTWORTHY
su ON
e poi di OFF
nuovo come indicato sopra. Ma se hai già TRUSTWORTHY
impostato su ON
, quindi capovolgilo e impostalo su OFF
e quindi immediatamente su ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Dolce.