none
CLR SQL Server 2005 RRS feed

  • Pregunta

  • Buenas colegas.

    Tengo un dilema con respecto a la funcionalidad CLR en SQL Server 2005.

    Estoy desarrollando una aplicación de servicios que utiliza conexiones remotas a servidores de algunos proveedores; cada proveedor me facilita un dll para acceder a su servidor.

    ...Entonces desarrolle una aplicación en .NET que realiza una parametrización y dinámicamente escoge el proveedor, y tipo de servicio que el cliente necesita. Busca en la BD el ensamblado, la ruta, la clase, el método y los parámetros, ya con esta información arma una llamada al método le envía los valores según sus parámetros y recibe la respuesta del servidor remoto.

    Todo esto funciona perfectamente desde una IU que diseñé para ir depurando la aplicación, pero la idea es que ésta aplicación sea compilada como una librería (DLL) y se llame mediante un Store Procedure.

    Así que he compilado la aplicación, y creado el assembly en SQL, que ha agregado automáticamente las referencias que mi código necesita (al menos eso creo).

    Las instrucciones que he utilizado son las siguientes:

    EXEC sp_configure 'clr enabled', 1
    RECONFIGURE
    GO
    
    ALTER DATABASE myDB SET TRUSTWORTHY ON
    GO
    
    CREATE ASSEMBLY Autorizaciones FROM 'C:\Ensamblados\AutorizacionesSOA.dll' WITH PERMISSION_SET = UNSAFE
    GO
    
    
    

    Así como su respectiva Función para invocar el ensamblado, esta función es llamada desde un SP.

    Al crear el assembly, automaticamente se han agregado las siguientes librerías:

    Accessibility
    AD
    ADODB
    Autorizaciones
    AutorizacionesLN
    System.Core
    System.Drawing
    System.Runtime.Serialization.Formatters.Soap
    System.Windows.Forms
    System.Xml.Linq
    UTILERIASEN
    

    Algunas las uso como referencia en el dll que he hecho, otras no las utilizo, al menos no las he referenciado.

    Lo cierto del caso es que cuando ejecuto el SP que es el que me debería de realizar el proceso, me devuelve una Excepción y por más información que he buscado, no logro dar con la solución del problema.

    La excepción se produce cuando en el DLL que he hecho se llama al método LoadFile de la clase Reflection.Assembly. Aquí está la excepción:

    Msg 6522, Level 16, State 1, Procedure sp_solicitud_servicio, Line 150
    A .NET Framework error occurred during execution of user-defined routine or aggregate "Autorizacion": 
    System.IO.FileLoadException: LoadFrom(), LoadFile(), Load(byte[]) and LoadModule() have been disabled by the host.
    System.IO.FileLoadException: 
      at ATS.AutorizacionesSOA.Servicio.AutorizacionSOA.Autorizacion(Int32 pvnConsecutivo, Int32 pvnDetTipServicio, String pvcTipoServicio, String pvcUserDB, String pvcPassUserDB, String pvcBDName, String pvcServerName)
    .
    

    Como siempre, muchas gracias. 

    miércoles, 20 de octubre de 2010 20:41

Respuestas

  • Usa dentro de tu codigo las sentencias catch y try. Haz una excepción especial para el error system.io.fileloadException para obtener más información. 

    Claramente el error es de permisos. No puede abrir un archivo desde un servidor remoto.

    Fíjate con que cuenta corres tu aplicación .net y con qué cuenta corre el servicio de SQL Server. Yo veo que simplemente es dar más permisos usuario con el cual corres el servicio de sql server.

    viernes, 12 de noviembre de 2010 21:45
  • Hola.

    Comentarte adicionalmente que lo que pretendes lograr tiene relevantes compromisos de seguridad para tu servidor. Yo me replantearía la realización del proceso dentro de un procedimiento almacenado. Desde una aplicación (la que sea que luego llame al procedimiento almacenado) te será igual de fácil realizar la llamada y la podrás hacer de un modo más simple y seguro sin comprometer el servidor de bases de datos con código desarrollado por un tercero. Eso por no hablar de la que parece una importante ventaja, que es el hecho de que la aplicación, sin usar el assembly, funciona.

    ¿Qué requerimiento te hace tener que contar con un procedimiento almacenado que llame al assembly?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    sábado, 13 de noviembre de 2010 6:23
    Moderador

Todas las respuestas

  • Usa dentro de tu codigo las sentencias catch y try. Haz una excepción especial para el error system.io.fileloadException para obtener más información. 

    Claramente el error es de permisos. No puede abrir un archivo desde un servidor remoto.

    Fíjate con que cuenta corres tu aplicación .net y con qué cuenta corre el servicio de SQL Server. Yo veo que simplemente es dar más permisos usuario con el cual corres el servicio de sql server.

    viernes, 12 de noviembre de 2010 21:45
  • Hola.

    Comentarte adicionalmente que lo que pretendes lograr tiene relevantes compromisos de seguridad para tu servidor. Yo me replantearía la realización del proceso dentro de un procedimiento almacenado. Desde una aplicación (la que sea que luego llame al procedimiento almacenado) te será igual de fácil realizar la llamada y la podrás hacer de un modo más simple y seguro sin comprometer el servidor de bases de datos con código desarrollado por un tercero. Eso por no hablar de la que parece una importante ventaja, que es el hecho de que la aplicación, sin usar el assembly, funciona.

    ¿Qué requerimiento te hace tener que contar con un procedimiento almacenado que llame al assembly?


    Alberto López Grande
    SQL Server MVP
    Visita mi blog en http://qwalgrande.blogspot.es/

    sábado, 13 de noviembre de 2010 6:23
    Moderador