Error al ejecutar un objeto CLR existente o crear un ensamblado

Este artículo le ayuda a resolver dos problemas diferentes que pueden producirse al trabajar con objetos CLR en una base de datos que se ha movido desde una instancia diferente de SQL Server.

Versión del producto original: SQL Server
Número de KB original: 918040

Síntomas

Imagina la siguiente situación: Desasocia o realiza una copia de seguridad de una base de datos que se encuentra en una instancia de SQL Server. La instancia de SQL Server se ejecuta en el servidor A. Más adelante, adjuntará o restaurará esa base de datos en una instancia de SQL Server que se ejecuta en el servidor B. En este escenario, puede experimentar los siguientes síntomas:

  • Al intentar ejecutar un objeto de Common Language Runtime (CLR) existente que tenga establecido el external_access permiso o no seguro de la base de datos que se encuentra en el servidor B, recibirá el siguiente mensaje de error:

    Msg 10314, Level 16, State 11, Line 2
    Error en Microsoft .NET Framework al intentar cargar el identificador de ensamblado 65536. Es posible que el servidor se esté quedando sin recursos o que el ensamblado no sea de confianza con PERMISSION_SET = EXTERNAL_ACCESS o UNSAFE. Vuelva a ejecutar la consulta o compruebe la documentación para ver cómo resolver los problemas de confianza del ensamblado. Para obtener más información sobre este error:
    System.IO.FileLoadException: no se pudo cargar el archivo o ensamblado "AssemblyName, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null" o una de sus dependencias. Error relacionado con la seguridad. (Excepción de HRESULT: 0x8013150A) System.IO.FileLoadException:
    at System.Reflection.Assembly.nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, Assembly locationHint, StackCrawlMark& stackMark, Boolean throwOnFileNotFound, Boolean forIntrospection) en System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) en System.Reflection.Assembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) en System.Reflection.Assembly.Load(String assemblyString)

  • Al intentar crear un nuevo ensamblado que tenga establecido el external_access permiso o no seguro en la misma base de datos, recibirá el siguiente mensaje de error:

    Servidor: Msg 10327, Level 14, State 1, Line 1
    Error de CREATE ASSEMBLY para el ensamblado "AssemblyName" porque el ensamblado "AssemblyName" no está autorizado para PERMISSION_SET = EXTERNAL_ACCESS. El ensamblado está autorizado cuando se cumple cualquiera de las siguientes condiciones: el propietario de la base de datos (DBO) tiene el permiso EXTERNAL ACCESS ASSEMBLY y la base de datos tiene la propiedad de base de datos TRUSTWORTHY en; o el ensamblado está firmado con un certificado o una clave asimétrica que tiene un inicio de sesión correspondiente con el permiso EXTERNAL ACCESS ASSEMBLY.

Los problemas se producen incluso si ya ha establecido la propiedad de base Trustworthy de datos en ON.

Causa

Este problema se produce porque el inicio de sesión que se usa para crear la base de datos en el servidor A no está en la instancia de SQL Server en el servidor B. Este inicio de sesión podría ser el inicio de sesión de Microsoft Windows o el inicio de sesión de SQL Server.

Solución alternativa

Para solucionar este problema, use uno de los métodos siguientes.

Nota:

Antes de usar los métodos siguientes, asegúrese de habilitar la Trustworthy propiedad de base de datos.

  • Use el sp_changedbowner procedimiento almacenado para cambiar el propietario de la base de datos a sa o a un inicio de sesión disponible en el servidor B. Por ejemplo, puede usar la siguiente instrucción para cambiar el propietario de la base de datos a sa:

    USE <DatabaseName>
    GO
    
    EXEC sp_changedbowner 'sa'
    

    Nota:

    En esta instrucción, <DatabaseName> es un marcador de posición del nombre de la base de datos en la que está trabajando. El propietario de la base de datos modificado debe tener los permisos correspondientes para realizar una tarea determinada. Por ejemplo, el propietario de la base de datos debe tener el permiso CREATE ASSEMBLY para crear un ensamblado.

  • Agregue el inicio de sesión en la instancia de SQL Server en el servidor A que se usa para crear la base de datos en la instancia de SQL Server en el servidor B.

Si el inicio de sesión es una cuenta de dominio, puede crear el mismo inicio de sesión en el servidor B. A continuación, conceda los permisos necesarios al inicio de sesión en la instancia de SQL Server en el servidor B.

Si el inicio de sesión es un inicio de sesión SQL Server, asegúrese de que el SID de este inicio de sesión coincida con el nuevo inicio de sesión SQL Server que cree en la instancia de SQL Server en el servidor B. Para ello, especifique el argumento SID de la CREATE LOGIN instrucción .

Más información

Si tiene acceso al objeto CLR desde una base de datos diferente y esa base de datos tiene un SID de DBO que no coincide, puede producirse el mismo problema.

Para obtener más información, visite el siguiente blog: Ingenieros de CSS SQL Server.

Referencias