Puede recibir un mensaje de error cuando intenta ejecutar un objeto existente de CLR o crear un ensamblado que tiene el conjunto de permisos external_access o no seguro en una base de datos que está adjunta o restaurada desde un servidor diferente


Error #: 423365 (SQLBUDT)

Síntomas


Considere el siguiente escenario. Desasocie o haga una copia de seguridad de una base de datos que se encuentra en una instancia de SQL Server 2005. La instancia de SQL Server 2005 se está ejecutando en el servidor A. Más adelante, adjunte o restaure la base de datos en una instancia de SQL Server 2005 que se esté ejecutando en el servidor B. En este escenario, puede experimentar los siguientes síntomas:
  • Cuando intenta ejecutar un objeto de Common Language Runtime (CLR) existente que tiene el conjunto de permisos external_access o no seguro de la base de datos que está en el servidor B, recibe el siguiente mensaje de error:
    Msj 10314, nivel 16, estado 11, línea 2An error en Microsoft .NET Framework al intentar cargar el ensamblado ID 65536. Es posible que el servidor se esté quedando sin recursos o que no se confíe en el ensamblado con PERMISSION_SET = EXTERNAL_ACCESS o no seguro. Vuelva a ejecutar la consulta o consulte la documentación para obtener información sobre cómo resolver los problemas de confianza del ensamblado. Para más información sobre este error, System. IO. FileLoadException: no se pudo cargar el archivo o el ensamblado 'AssemblyName, version = 0.0.0.0, Culture = neutral, PublicKeyToken = null ' o una de sus dependencias. Se ha producido un error relacionado con la seguridad. (Excepción de HRESULT: 0x8013150A) System. IO. FileLoadException: en System. Reflection. Assembly. nLoad (AssemblyName fileName, cadena base, evidencia assemblySecurity, ensamblado 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
  • Cuando intenta crear un nuevo ensamblado que tiene el conjunto de permisos external_access o no seguro en la misma base de datos, recibe el siguiente mensaje de error:
    Servidor: mensaje 10327, nivel 14, estado 1, línea 1CREATE se ha producido un error de línea para el ensamblado 'AssemblyName' porque el ensamblado 'AssemblyName' no está autorizado para PERMISSION_SET = external_access. El ensamblado se autoriza cuando se cumple una de las condiciones siguientes: el propietario de la base de datos (DBO) tiene el permiso de ENSAMBLAdo de acceso externo y la base de datos tiene la propiedad de base de datos TRUSTWORTHY on; o el ensamblado se firma con un certificado o una clave asimétrica que tiene un inicio de sesión correspondiente con el permiso de ENSAMBLAdo de acceso externo.
Los problemas se producen incluso si ya ha establecido la propiedad de base de datos Trustworthy como activada.

Causa


Este problema se produce porque el inicio de sesión que usa para crear la base de datos en el servidor a no está en la instancia de SQL Server 2005 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 propiedad de base de datos Trustworthy .
  • Use el procedimiento almacenado sp_changedbowner 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>GOEXEC 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 cambiada debe tener los permisos correspondientes para realizar una tarea determinada. Por ejemplo, el propietario de la base de datos debe tener el permiso crear ENSAMBLAdo para crear un ensamblado.
  • Agregue el inicio de sesión en la instancia de SQL Server 2005 en el servidor a que se usa para crear la base de datos en la instancia de sql Server 2005 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 2005 en el servidor B. Si el inicio de sesión es un inicio de sesión de SQL Server, asegúrese de que el SID de este inicio de sesión coincide con el nuevo inicio de sesión de SQL Server que cree en la instancia de SQL Server 2005 en el servidor B. Para ello, especifique el argumento SID de la instrucción CREATE LOGIN.

Más información


Si accede al objeto CLR desde una base de datos diferente y esa base de datos tiene un SID DBO que no coincide, se puede producir el mismo problema. Para obtener más información, visite el siguiente blog:

Estado


Microsoft ha confirmado que se trata de un problema de los productos de Microsoft recogidos en la sección "Se aplica a".

Referencias


Para obtener más información sobre la declaración de creación de inicio de sesión, visite el siguiente sitio web de Microsoft Developer Network (MSDN): Para obtener más información sobre el sp_changedbowner procedimiento almacenado, visite el siguiente sitio web de MSDN: Para obtener más información sobre la instrucción CREATE ASSEMBLy, visite el siguiente sitio web de MSDN: