Quero forçar o AppDomain que está sendo usado pelo SQLCLR a ser redefinido. Como posso fazer isso além de reiniciar a instância do SQL Server?
sql-server
sql-clr
Justin Dearing
fonte
fonte
Respostas:
Sei que isso é um pouco brutal, mas que tal desabilitar o CLR e reativá-lo?
fonte
ALTER ASSEMBLY
propagado via envio de logs que não recarregou (ou pelo menos descarregou) o Domínio do Aplicativo foi o bug. De qualquer maneira, encontrei um método ainda mais fácil que adicionei à minha resposta aqui. Se você tivesse a capacidade de testar esse novo método, seria ótimo, pois estou muito curioso para ver se ele funciona no cenário de envio de logs que você descreveu.Existe uma solução mais elegante que não afeta todos os outros assemblies: basta alterar o PERMISSION_SET de um dos assemblies no domínio do aplicativo (os domínios do aplicativo são por usuário).
Lembre-se de que você precisará definir o PERMISSION_SET de volta ao que era. Além disso, você precisa acessar um método na montagem antes de alterar o PERMISSION_SET para descarregá-lo; alterar um assembly que não está atualmente carregado em um domínio de aplicativo ativo, mas com outro assembly, não afeta o domínio de aplicativo (os domínios de aplicativo são por DB, por usuário e não por assembly).
ATUALIZAÇÃO
O método descrito acima é a abordagem mais refinada em que apenas descarrega esse domínio de aplicativo. Porém, exige que a montagem possa ser configurada para um dos outros dois níveis. Para montagens marcadas como
SAFE
somente será possível seTRUSTWORTHY ON
ouEXTERNAL ACCESS ASSEMBLY
aUNSAFE ASSEMBLY
permissão ou a permissãoNesse caso, você pode simplesmente alterar a
TRUSTWORTHY
configuraçãoON
e voltar imediatamente imediatamenteOFF
e isso descarregará todos os domínios de aplicativo nesse banco de dados específico:Se você tiver apenas um domínio de aplicativo no banco de dados de qualquer maneira (e suspeito que esse seja o caso em 95% ou mais do tempo), os dois métodos descritos aqui têm o mesmo efeito líquido. E nessa situação, o
ALTER DATABASE
método parece mais simples, pois não requer a especificação de um nome de objeto específico, nem o conhecimento do originalPERMISSION_SET
.Além disso, se você tiver apenas um único domínio de aplicativo, o
ALTER DATABASE
método será mais simples, mesmo no caso em que o banco de dados já esteja definidoTRUSTWORTHY ON
ou você tenha configurado o login da base de chave com a permissão apropriada. Se você estiver usando um logon baseado em chave, poderá definirTRUSTWORTHY
comoON
eOFF
novamente como mencionado acima. Mas se você já tiverTRUSTWORTHY
definidoON
, basta inverter e configurá-lo comoOFF
e, em seguida, retornar imediatamente paraON
:fonte
SELECT * FROM sys.dm_clr_appdomains;
. Doce.