Visão geral da integração CLR
Aplica-se a:SQL ServerAzure SQL Managed Instance
O Common Language Runtime (CLR) é o coração do .NET Framework e fornece o ambiente de execução para todo o código do .NET Framework. O código executado dentro do CLR é conhecido como código gerenciado. O CLR fornece várias funções e serviços necessários para a execução do programa, incluindo compilação just-in-time (JIT), alocação e gerenciamento de memória, imposição de segurança de tipo, tratamento de exceções, gerenciamento de threads e segurança. Para obter mais informações, consulte guia de desenvolvimento do .NET Framework.
Observação
Para obter mais informações sobre como usar o novo .NET com extensões de linguagem do SQL Server, consulte Como chamar o tempo de execução do .NET no SQL Server Language Extensions.
Com o CLR hospedado no SQL Server (chamado de integração CLR), você pode criar procedimentos armazenados, gatilhos, funções definidas pelo usuário, tipos definidos pelo usuário e agregações definidas pelo usuário em código gerenciado. Como o código gerenciado é compilado para código nativo antes da execução, você pode obter aumentos significativos de desempenho em alguns cenários.
Segurança de acesso ao código
No SQL Server 2016 (13.x) e versões anteriores, o CAS (Segurança de Acesso ao Código) impedia que assemblies executassem determinadas operações.
O CLR usa o CAS (Code Access Security) no .NET Framework, que não é mais suportado como um limite de segurança. Um assembly CLR criado com PERMISSION_SET = SAFE
pode acessar recursos externos do sistema, chamar código não gerenciado e adquirir privilégios sysadmin. No SQL Server 2017 (14.x) e versões posteriores, a opção sp_configure
, de segurança estrita clr, aumenta a segurança dos assemblies CLR.
clr strict security
está habilitado por padrão e trata SAFE
e EXTERNAL_ACCESS
assemblies como se estivessem marcados UNSAFE
. A opção clr strict security
pode ser desativada para compatibilidade com versões anteriores, mas não é recomendada.
Recomendamos que você assine todos os assemblies por um certificado ou chave assimétrica, com um logon correspondente que tenha recebido permissão UNSAFE ASSEMBLY
no banco de dados master
. Os administradores do SQL Server também podem adicionar assemblies a uma lista de assemblies, nos quais o Mecanismo de Banco de Dados deve confiar. Para obter mais informações, consulte sys.sp_add_trusted_assembly.
Vantagens da integração CLR
Transact-SQL é projetado para acesso direto a dados e manipulação no banco de dados. Embora Transact-SQL se destaque no acesso e gerenciamento de dados, não é uma linguagem de programação completa. Por exemplo, Transact-SQL não suporta matrizes, coleções, loops para cada um, deslocamento de bits ou classes. Embora algumas dessas construções possam ser simuladas no Transact-SQL, o código gerenciado tem suporte integrado para essas construções. Dependendo do cenário, esses recursos podem fornecer um motivo convincente para implementar determinadas funcionalidades de banco de dados em código gerenciado.
Visual Basic e C# oferecem recursos orientados a objetos, como encapsulamento, herança e polimorfismo. O código relacionado agora pode ser facilmente organizado em classes e namespaces. Quando você está trabalhando com grandes quantidades de código de servidor, esses recursos permitem que você organize e mantenha seu código com mais facilidade.
O código gerenciado é mais adequado do que Transact-SQL para cálculos e lógica de execução complicada e apresenta suporte extensivo para muitas tarefas complexas, incluindo manipulação de cadeia de caracteres e expressões regulares. Com a funcionalidade encontrada no .NET Framework, você tem acesso a milhares de classes e rotinas pré-criadas. Essas classes podem ser facilmente acessadas a partir de qualquer procedimento armazenado, gatilho ou função definida pelo usuário. A biblioteca de classes base (BCL) inclui classes que fornecem funcionalidade para manipulação de cadeia de caracteres, operações matemáticas avançadas, acesso a arquivos, criptografia e muito mais.
Observação
Embora muitas dessas classes estejam disponíveis para uso no código CLR no SQL Server, aquelas que não são apropriadas para uso no servidor (por exemplo, classes de janela) não estão disponíveis. Para obter mais informações, consulte bibliotecas suportadas do .NET Framework.
Um dos benefícios do código gerenciado é a segurança de tipo, ou a garantia de que o código acessa tipos apenas de maneiras bem definidas e permitidas. Antes do código gerenciado ser executado, o CLR verifica se o código é seguro. Por exemplo, o código é verificado para garantir que nenhuma memória seja lida que não tenha sido escrita anteriormente. O CLR também pode ajudar a garantir que o código não manipule a memória não gerenciada.
A integração CLR oferece o potencial para melhorar o desempenho. Para obter informações, consulte desempenho da arquitetura de integração CLR.
Escolha entre Transact-SQL e código gerenciado
Ao escrever procedimentos armazenados, gatilhos e funções definidas pelo usuário, você deve decidir se deseja usar o Transact-SQL tradicional ou uma linguagem do .NET Framework como Visual Basic ou C#. Use Transact-SQL quando o código executa principalmente o acesso aos dados com pouca ou nenhuma lógica processual. Use código gerenciado para funções e procedimentos com uso intensivo de CPU que apresentam lógica complexa ou quando quiser usar a BCL do .NET Framework.
Escolha entre a execução no servidor e a execução no cliente
Outro fator na sua decisão sobre usar Transact-SQL ou código gerenciado é onde você gostaria que seu código residisse, o computador servidor ou o computador cliente. Tanto o Transact-SQL quanto o código gerenciado podem ser executados no servidor. Isso coloca o código e os dados próximos e permite que você aproveite o poder de processamento do servidor. Por outro lado, você pode querer evitar colocar tarefas intensivas do processador em seu servidor de banco de dados. A maioria dos computadores clientes hoje em dia são poderosos, e você pode querer tirar proveito desse poder de processamento colocando o máximo de código possível no cliente. O código gerenciado pode ser executado em um computador cliente, enquanto Transact-SQL não pode.
Escolha entre procedimentos armazenados estendidos e código gerenciado
Os procedimentos armazenados estendidos podem ser criados para executar funcionalidades que não são possíveis com Transact-SQL procedimentos armazenados. No entanto, os procedimentos armazenados estendidos podem comprometer a integridade do processo do SQL Server, enquanto o código gerenciado que é verificado como seguro para tipos não pode. Além disso, o gerenciamento de memória, o agendamento de threads e fibras e os serviços de sincronização são mais profundamente integrados entre o código gerenciado do CLR e do SQL Server. Com a integração CLR, você tem uma maneira mais segura do que os procedimentos armazenados estendidos para escrever os procedimentos armazenados necessários para executar tarefas que não são possíveis no Transact-SQL. Para obter mais informações sobre integração CLR e procedimentos armazenados estendidos, consulte Performance of CLR integration architecture.