Red de conocimiento informático - Material del sitio web - Cómo actualizar el ensamblado CLR en Sql Server

Cómo actualizar el ensamblado CLR en Sql Server

Esto mejora enormemente la funcionalidad de Sql Server y aporta comodidad al desarrollo de programación. Hay muchos artículos introductorios sobre cómo crear procedimientos almacenados CLR en Internet, por lo que no los discutiré en este artículo. El autor encontró un problema de este tipo durante el uso, es decir, el problema de actualización del ensamblado. Los ensamblados no se pueden modificar en Sql Server, solo se pueden eliminar y reconstruir. Vea la imagen a continuación: Si desea eliminarlo usando el comando soltar, aparecerá esto:

Debido a que el objeto 'IsLegalDate' se refiere a 'ZSqlExtend', DROP ASSEMBLY falló. Resulta que se deben crear muchos procedimientos y funciones almacenados en función de este ensamblado. Estos objetos hacen referencia a este ensamblado y DROP ASSEMBLY falló. Puede hacer clic en "Ver dependencias" en la imagen de arriba. ¿Qué hacer? La única forma es eliminar todos los objetos que hacen referencia a este ensamblaje, lo que aumentará la carga de trabajo, y estos procedimientos y funciones almacenados deberán compilarse después de que se reconstruya el ensamblaje. También se puede hacer referencia a estos procedimientos y funciones almacenados y no se pueden eliminar. ¿No sería demasiado problemático para nosotros actualizar el ensamblaje? Al autor se le ocurrió una solución para comunicarse con la mayoría de los internautas. Primero, el código de ZSqlExtend es el siguiente y contiene una función IsLegalDate. El archivo compilado con VS2008 es ZSqlExtend.dll.

usando System.Data.SqlTypes;

usando System.Data.SqlClient;

usando System.Text.RegularExpressions; espacio de nombres ZSqlExtend_NS{clase pública ZSqlExtend_cls{[SqlFunction(DataAccess = DataAccessKind.Read) )]

public static bool IsLegalDate(int iyear, int imonth, int iday){bool ild = false; try{DateTime newdate = new DateTime(iyear, imonth, iday);

FechaHora dMin = nueva FechaHora(1900, 1, 1);

FechaHora dMax = nueva FechaHora(2079, 6, 7);

ild = nueva fecha gt = dMin amp; amp; newdate lt; dMax; }catch {ild = false; } return ild;

}} //END CLASS }Crea ensamblajes y funciones en Sql Server basados ​​en este archivo dll: crea ensamblaje ZSqlExtend

de 'E:\hs1\ZSqlExtend\bin\ZSqlExtend.dll' con permiso_set = Safe;

ir a CREAR FUNCIÓN IsLegalDate

(@y int, @ m int, @d int)

RETORNE bit

COMO NOMBRE EXTERNO ZSqlExtend.[ZSqlExtend_NS.ZSqlExtend_cls].IsLegalDate;

vaya y luego cree un proyecto de biblioteca de clases Por ejemplo, si hago otro proyecto de biblioteca de clases ZSqlExtend_dummy, el archivo compilado con VS2008 es ZSqlExtend_dummy.dll, que reemplaza a ZSqlExtend.dll. Escribe el contenido de ZSqlExtend.dll aquí nuevamente, pero este es falso, así que puedes escribirlo así: usando System.Data.SqlTypes

using System.Data.SqlClient

<; p >usando System.Text.RegularExpressions; espacio de nombres ZSqlExtend_NS{clase pública ZSqlExtend_cls{[SqlFunction(DataAccess = DataAccessKind.Read)]

bool estático público IsLegalDate(int iyear, int imonth, int iday){return true ;

} } //END CLASS }Registre este ZSqlExtend_dummy.dll "falso" en Sql Server.

cree el ensamblado ZSqlExtend_dummy

desde 'E:\hs1\ZSqlExtend_dummy\bin\ZSqlExtend_dummy.dll' con permiso_set = Seguro. Nuestro primer paso está completo. Ahora he modificado IsLegalDate en el proyecto ZSqlExtend y necesito reconstruir el ensamblado, que es la situación al principio de este artículo. Por supuesto, primero puede eliminar IsLegalDate, pero no puedo hacerlo porque muchas vistas y campos calculados de tablas hacen referencia a IsLegalDate. Entonces solo puedo desacoplar IsLegalDate del ensamblado ZSqlExtend y luego eliminar y reconstruir el ensamblado ZSqlExtend. Si desea desacoplar, debe usar ZSqlExtend_dummy, porque su firma de función es exactamente la misma que ZSqlExtend. La función IsLegalDate no se puede eliminar, pero sí modificarla y cambiarla a otros ensamblados. Ejecutado en Sql Server: alter FUNCTION IsLegalDate

(@y int, @m int, @d int)

RETORNE bit

COMO NOMBRE EXTERNO ZSqlExtend_dummy.[ ZSqlExtend_NS.ZSqlExtend_cls].IsLegalDate; goOK En este momento, el ensamblado ZSqlExtend se puede eliminar y reconstruir Ejecutar en Sql Server: soltar el ensamblado ZSqlExtend

desde 'E:\hs1\ZSqlExtend\. bin \ZSqlExtend.dll' con permiso_set = Safe;

Go, por supuesto, también necesita cambiar la función IsLegalDate nuevamente para alterar FUNCTION IsLegalDate

(@y int, @m int, @ d int)

RETORNO bit

COMO NOMBRE EXTERNO ZSqlExtend.[ZSqlExtend_NS.ZSqlExtend_cls].IsLegalDate; go necesita prestar atención a dos cuestiones aquí: 1. Tal vez pregunte, ya que desea cambiar la función IsLegalDate Elimínela y hágala irrelevante para el ensamblado ZSqlExtend. ¿Por qué no usar la declaración directamente: ALTER FUNCTION [dbo].[IsLegalDate](@y [int], @m [int], @d [ int])

DEVOLUCIONES [bit]beginreturn 1;end Jaja, recibirá el siguiente mensaje: 'dbo.IsLegalDate' no se puede cambiar porque es un tipo de objeto incompatible. 2. ¿Por qué necesitas compilar otra DLL? ¿No sería "falso" si se cambiara el nombre del ZSqlExtend.dll compilado?