Tenho um banco de dados pré-SQL Server 2017 que restaurei/atualizei para o SQL Server 2017. Neste banco de dados tenho um Assembly SQLCLR. O Assembly está marcado como SAFE
, pois não faz nada que exija um nível mais alto de permissões e o banco de dados TRUSTWORTHY
desabilitou / OFF
. As funções SQLCLR e os procedimentos armazenados funcionaram conforme o esperado antes de migrar para o SQL Server 2017, mas agora quando tento executar qualquer um deles recebo o seguinte erro:
Msg 10314, Level 16, State 11, Server XXXXXXXXXXX, Line YYYYYY
Ocorreu um erro no Microsoft .NET Framework ao tentar carregar o ID do assembly ZZZZZ. O servidor pode estar ficando sem recursos ou o assembly pode não ser confiável. Execute a consulta novamente ou verifique a documentação para ver como resolver os problemas de confiança do assembly. Para obter mais informações sobre este erro:
System.IO.FileLoadException: não foi possível carregar o arquivo ou assembly '{assembly_name}, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' ou uma de suas dependências. Ocorreu um erro relacionado à segurança. (Exceção de HRESULT: 0x8013150A)
Confirmei que a integração CLR/SQLCLR foi habilitada no servidor/instância.
O erro é resultado da nova
clr strict security
opção de configuração no nível do servidor no SQL Server 2017. Essa nova configuração de segurança impede que qualquer Assembly, mesmo aqueles marcados comoSAFE
, seja criado ou carregado na memória para execução, a menos que:TRUSTWORTHY
éON
(não faça isso, pois é um risco de segurança desnecessário) e o login que é o proprietário do banco de dados (ou seja, o mesmo SID usado pelo[dbo]
usuário) precisa ter aUNSAFE ASSEMBLY
permissão (que já pode ter se o proprietário ésa
ou um membro dasysadmin
função de servidor fixa ou talvez tenha aCONTROL SERVER
permissão).clr strict security
está desabilitada /0
(não faça isso, pois é um risco de segurança desnecessário)UNSAFE ASSEMBLY
permissão ( por favor, faça isso)Tudo o que você precisa fazer para corrigir essa situação são as seguintes etapas (que não são difíceis e fornecem o mais alto nível de segurança):
SAFE
assemblies:[master]
(somente chave pública!)UNSAFE ASSEMBLY
permissão ao Login baseado em certificadoUm exemplo simples disso (menos o backup opcional e a remoção da chave privada) seria:
Um exemplo totalmente funcional disso (menos o backup e a remoção da chave privada) pode ser encontrado no PasteBin:
Evitando "Assemblies confiáveis" - Demo
Uma explicação detalhada de por que você deve usar Certificados e por que você não deve usar "Trusted Assemblies" para corrigir esse problema é fornecida em minha postagem no blog:
SQLCLR vs. SQL Server 2017, Parte 4: “Trusted Assemblies” – The Disappointment
Além disso, considere apoiar minha solicitação para que a Microsoft remova o novo recurso "Trusted Assemblies" devido aos vários problemas que o cercam (incluindo preocupações de segurança) e a falta geral de benefícios para tê-lo:
Os assemblies confiáveis são mais problemáticos, mas menos funcionais do que os certificados - remova