Dll de terceros en SQL Server CLR

14

Necesito usar una DLL de terceros en un código de activación de C # en SQL Server CLR

Pero cuando intento agregar una referencia, solo muestra algunas DLL de SQL Server.

¿Cómo puedo agregar mi dll de terceros a SQL Server?

Solomon Rutzky
fuente
2
¿De la misma manera que agrega ensambles CLR de SQL ?

Respuestas:

14

Solo puede agregar referencias a los ensamblados que se han registrado con SQL Server. Si no están registrados, no aparecerán en el cuadro de diálogo Agregar referencias.

Hay una serie de pasos que necesitará para registrar una DLL, primero deberá reconfigurar su base de datos:

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

Una vez hecho esto, SQL Server está habilitado para CLR. A continuación, deberá registrar su ensamblaje:

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

Si este último script se ejecuta correctamente, el ensamblado ahora está registrado y aparecerá en el cuadro de diálogo Agregar referencias.

Sin embargo, lo que deberá tener en cuenta es la seguridad de la aplicación de la configuración CLR de su servidor SQL:

  1. Prefiere registrar un ensamblaje como SAFE, solo en circunstancias excepcionales debe usar EXTERNAL_ACCESSo UNSAFE.
  2. No espere poder hacer todo lo que pueda en CLR de plena confianza (es decir, no en el CLR alojado por Sql Server): el SQLCLR es un tiempo de ejecución de espacio aislado.
  3. No intente cargar ensamblajes dinámicamente, ya que Assembly.Load()está restringido a propósito.
  4. Es posible que deba asegurarse de que la biblioteca de terceros esté firmada con una clave pública si planea usarla UNSAFE.
  5. La ejecución de código se ejecuta en el contexto de la identidad del servicio que ejecuta Sql Server (¡creo!)
  6. El acceso a la base de datos realizado desde un ensamblado alojado (por ejemplo, a través de context connection = true;) se ejecuta en el contexto del usuario conectado, por lo que debe asegurarse de saber qué acceso tiene esa biblioteca a sus datos.
Matthew Abbott
fuente
en el 4 de arriba, debe firmar el ensamblaje Obtuve esa parte, y he podido hacerlo a través de instrucciones autofirmadas aquí: geekswithblogs.net/ktegels/archive/2006/02/16/… Pero cómo instalar el certificado cuando no tiene la clave privada, es decir, cuándo ensamblado fue creado y firmado por un tercero confiable? Por lo que puedo decir en el enlace de arriba, la creación del certificado requiere la clave privada para estar presente. ¿Eso parece hacer esto imposible?
JorgeSandoval
2
Además, marcar db como confiable es arriesgado (e innecesario para una instalación de ensamblaje "segura"). Confiable es una forma de evitar tener que firmar ensamblajes para permisos externos / inseguros, pero no se recomienda ya que cualquier ensamblaje CLR instalado será confiable ...
JorgeSandoval
5

Supongo que está preguntando sobre alternativas para instalar ensamblados CLR de SQL desde Visual Studio.

No es necesario tener el código en Visual Studio.

La implementación de objetos de base de datos CLR en MSDN detalla las opciones, incluidas las instrucciones SQL y los scripts de implementación.

Oded
fuente
1

Utilizo una DLL de terceros muy grande que toma una página web y la convierte en un PDF.

El PDF se guarda en un archivo compartido y la base de datos se actualiza en cuanto a su ubicación y tipo.

Este es un proceso de 3 pasos:

  1. Cree una aplicación de consola que use la DLL de terceros para crear el PDF y acepte la URL y FilePath como parámetros y devuelva el tamaño del PDF y el número de páginas.

  2. Cree un procedimiento almacenado CLR que luego llame a la aplicación de consola en el servidor

  3. Envuelvo todo esto en un único procedimiento almacenado que llama a la aplicación CLR para crear el PDF y luego escribo metadatos sobre él en la base de datos.

Me doy cuenta de que esto no es perfecto y de ninguna manera deberías hacer algo tan loco dentro de un gatillo.

Solo lo menciono aquí para otros que tengan preguntas sobre el uso de DLL de terceros en su CLR.

Mi esperanza es que al girar una consola cmd.exe para ejecutar la DLL de terceros, en lugar de ejecutar todo en el proceso, si se bloquea, no afectará negativamente tanto a SQL Server. Eso es lo que espero.

Comente si este es un enfoque realmente malo y por qué.

MikeTeeVee
fuente