c# - Hacer referencia al ensamblaje firmado en SQL Server 2008R2
.net visual-studio-2012 (2)
Para seguridad y estabilidad, SQLCLR tiene acceso limitado a solo un pequeño subconjunto de ensamblajes GAC aprobados. Todos los demás deben estar registrados explícitamente dentro de la base de datos.
ver https://msdn.microsoft.com/en-us/library/ms403279(v=sql.105).aspx
SQL Server CLR solo permite que se cargue lo siguiente desde el GAC:
CustomMarshalers
Microsoft.VisualBasic
Microsoft.VisualC
mscorlib
System
System.Configuration
System.Data
System.Data.OracleClient
System.Data.SqlXml
System.Deployment
System.Security
System.Transactions
System.Web.Services
System.Xml
Tengo una biblioteca de clases C .NET 3.5 (DLL) que se utiliza en algunas tareas de script de SSIS, por lo que debe cargarse en el GAC, lo que significa que debe estar firmado. Creé una clave y firmé la DLL, y funciona en SSIS.
Ahora también quiero cargar esta DLL al servidor SQL, y creé algunos objetos CLR que hacen referencia a los métodos en la clase en esta DLL. Tengo un proyecto de base de datos VS2012 y agregué una referencia a la DLL, estableciendo las propiedades IsVisible y ModelAware en verdadero. Extendí la clase UserDefinedFunctions para agregar mis dos funciones que llaman a métodos estáticos en la DLL.
Tanto el ensamblado al que se hace referencia como los objetos CLR en mi proyecto de base de datos están configurados en SAFE
ya que no necesitan nada excepto lo que está en la base de datos.
El proyecto se compila, pero falla al publicar en mi base de datos local con este extraño error:
Creating [<<REFERENCED_DLL>>]...
Creating [<<CURRENT_DATABASE_CLR>>]...
(288,1): SQL72014: .Net SqlClient Data Provider:
Msg 6218, Level 16, State 2, Line 1
CREATE ASSEMBLY for assembly ''<<CURRENT_DATABASE_CLR>>'' failed
because assembly ''<<CURRENT_DATABASE_CLR>>'' failed verification.
Check if the referenced assemblies are up-to-date and trusted
(for external_access or unsafe) to execute in the database.
CLR Verifier error messages if any will follow this message
[ : UserDefinedFunctions::sf_Function1][mdToken=0x6000001][offset 0x00000005]
Unable to resolve token.
[ : UserDefinedFunctions::sf_Function2][mdToken=0x6000002][offset 0x00000005]
Unable to resolve token.
Lo que es una locura es que si construyo mi ensamblado <<REFERENCED_DLL>>
y no lo firmo, el proyecto publica bien y las funciones funcionan como se espera. Intenté firmar mi proyecto de base de datos y agregar AllowPartiallyTrustedCallers
a la DLL referenciada.
Realmente quiero tener solo una versión de esta DLL que se pueda usar tanto en el GAC como en el servidor SQL. ¿Cómo puedo hacer esto?
¿Has registrado la clave fuerte con la base de datos?
Cree una clave maestra en la base de datos maestra, si no existe:
USE MASTER;
CREAR ENCRIPTACIÓN DE LLAVE MAESTRA POR CONTRASEÑA = ''su_contraseña'';
Cree una clave asimétrica en la base de datos maestra para la clave fuerte. Deberá copiar el archivo .snk en el servidor de la base de datos, pero una vez registrado, puede eliminarlo del servidor.
CREAR CLAVE ASIMÉTRICA sqlkey FROM FILE = ''path_to_the_strong_name_key'';
Cree un inicio de sesión desde la clave asimétrica en la base de datos maestra.
CREAR INICIAR SESIÓN yourlogin FROM ASYMMETRIC KEY yourkey;
Ingrese el nombre de usuario que acaba de crear el permiso ASAMBLEA NO SEGURA
OTORGAR ASAMBLEA NO SEGURA a yourlogin;
Prefiero publicar directamente desde Visual Studio, pero debería poder hacer lo mismo con.
CREATE ASSEMBLY yourSQLCLR
FROM ''C://yourSignedSQLCLR.dll''
WITH PERMISSION_SET = UNSAFE | SAFE | EXTERNAL_ACCESS