DLL de terceiros no SQL Server CLR

14

Preciso usar uma DLL de terceiros em um código c # de gatilho no SQL Server CLR

Mas quando tento adicionar referência, apenas mostra algumas DLLs do SQL Server.

Como posso adicionar minha DLL de terceiros ao SQL Server?

Solomon Rutzky
fonte
2
Da mesma maneira que você adiciona assemblies SQL CLR ?

Respostas:

14

Você só pode adicionar referências aos assemblies que foram registrados no Sql Server. Se eles não estiverem registrados, eles não aparecerão na caixa de diálogo Adicionar referências.

Existem várias etapas para registrar uma DLL, primeiro reconfigure seu banco de dados:

ALTER DATABASE [MyDatabase] SET TRUSTWORTHY ON;
sp_configure 'clr enabled', 1;
RECONFIGURE;

Feito isso, o Sql Server está ativado para CLR. Em seguida, você precisará registrar sua montagem:

CREATE ASSEMBLY [MyAssembly] AUTHORIZATION [MyUser]
FROM 'C:\CLR\MyAssembly.dll'
WITH PERMISSION_SET = SAFE

Se esse último script for executado corretamente, o assembly agora está registrado e aparecerá na caixa de diálogo Adicionar referências.

O que você precisará considerar, porém, é a segurança do aplicativo da configuração do Sql Server CLR:

  1. Prefira registrar uma montagem como SAFE, somente em circunstâncias excepcionais você deve usar EXTERNAL_ACCESSou UNSAFE.
  2. Não espere poder fazer tudo o que puder no CLR de confiança total (ou seja, não no CLR hospedado pelo Sql Server) - o SQLCLR é um tempo de execução em área restrita.
  3. Não tente carregar montagens dinamicamente, pois Assembly.Load()é propositadamente restrito.
  4. Pode ser necessário garantir que a biblioteca de terceiros seja assinada com uma chave pública se você planeja usar UNSAFE.
  5. A execução de código é executada no contexto da identidade do serviço que está executando o Sql Server (eu acho!)
  6. O acesso ao banco de dados feito a partir de um assembly hospedado (por exemplo, via context connection = true;) é executado no contexto do usuário conectado, portanto, você precisa ter certeza de que acesso essa biblioteca tem aos seus dados.
Matthew Abbott
fonte
em 4 acima, você deve assinar a montagem. Eu recebo essa parte e pude fazê-lo através de instruções autoassinadas aqui: geekswithblogs.net/ktegels/archive/2006/02/16/… Mas como instalar o certificado quando você não possui a chave privada, ou seja, quando assembly foi criado e assinado por terceiros confiáveis? Tanto quanto eu posso dizer no link acima, a criação do certificado exige que uma chave privada esteja presente. Isso parece tornar isso impossível?
JorgeSandoval
2
Também - marcar db como confiável é arriscado (e desnecessário para a instalação de montagem "Segura"). Confiável é uma maneira em torno de ter de assinar montagens para permissões externos / inseguras, mas não é recomendado como qualquer CLR montagem instalada será de confiança ...
JorgeSandoval
5

Suponho que você esteja perguntando sobre alternativas para instalar assemblies SQL CLR do Visual Studio.

Não é necessário ter o código no Visual Studio.

A implantação de Objetos de Banco de Dados CLR no MSDN detalha as opções, incluindo instruções SQL e scripts de implantação.

Oded
fonte
1

Eu uso uma DLL de terceiros muito grande que pega uma página da Web e a converte em PDF.

O PDF é salvo em um compartilhamento de arquivos e o banco de dados é atualizado quanto à sua localização e tipo.

Este é um processo de três etapas:

  1. Crie um aplicativo de console que use a DLL de terceiros para criar o PDF e aceite a URL e o FilePath como parâmetros e retorne o tamanho e o número de páginas do PDF.

  2. Crie um procedimento armazenado CLR que chame o aplicativo de console no servidor

  3. Agrupo tudo isso em um único procedimento armazenado que chama o aplicativo CLR para criar o PDF e, em seguida, escrevo metadados sobre ele no banco de dados.

Sei que isso não é perfeito e de maneira alguma você deve fazer algo tão louco dentro de um gatilho!

Eu apenas o mencionei aqui para outras pessoas com perguntas sobre o uso de DLLs de terceiros em seus CLR.

Minha esperança é que, girando um console do cmd.exe para executar a DLL de terceiros, em vez de executar tudo em processo, se houver uma falha, isso não afetará tanto o SQL Server. É o que eu espero.

Por favor, comente se esta é uma abordagem realmente ruim e por quê.

MikeTeeVee
fonte