Los inicios de sesión de usuario y permisos en una base de datos pueden ser incorrectos después de restaura la base de datos


Síntomas


Si un volcado de una base de datos de usuario de SQL Server se restaura a una diferente de SQL Server (como un servidor de copia de seguridad activa) o a la misma de SQL Server después de volver a generar o volver a cargar una versión antigua de la base de datos master, inicios de sesión de usuario y permisos en la base de datos pueden ser incorrectos.

Este problema puede revelar a sí mismo de varias maneras:
  • Al iniciar sesión en un servidor 6.x, los usuarios pueden recibir el siguiente error:
    Msg 4002, nivel 14, estado 1, servidor Microsoft SQL Server, línea 0
    Error al iniciar sesión
    DB-Library: Inicio de sesión incorrecto.
  • Al iniciar sesión en un servidor 7.0, los usuarios pueden recibir el siguiente error:
    Msj 18456, nivel 14, estado 1,
    Error de inicio de sesión para usuario '%ls'.
  • Al intentar tener acceso a objetos en la base de datos, los usuarios pueden recibir el siguiente error:
    Mensaje 229, nivel 14, estado 1
    permiso de %s denegado para el objeto %. * s, base de datos %. * s, propietario %.*s
  • Al intentar crear un inicio de sesión y conceder acceso a la base de datos restaurada o agregar el usuario a la base de datos, puede recibir el siguiente error:
    Microsoft SQL-DMO (SQLState de ODBC: 42000) Error 15023: usuario o función '%s' ya existe en la base de datos actual.
  • Los usuarios pueden tener permisos en objetos que previamente no lo hicieron.

Causa


Información de inicio de sesión de usuario se almacena en la tabla syslogins de la base de datos master. Cambiando los servidores, o mediante la modificación de esta información por reconstruir o restaurar una versión anterior de la base de datos master, la información puede ser diferente de cuando se creó el volcado de la base de datos de usuario. Si no existen los inicios de sesión de los usuarios, recibirá un error que indica "Error de inicio de sesión" al intentar iniciar sesión en el servidor. Si los inicios de sesión de usuario existe, pero los valores SUID (para 6.x) o SID (de 7.0) en master.. syslogins y la tabla sysusers de la base de datos de usuario son diferentes, los usuarios pueden tener permisos diferentes de lo esperado en la base de datos de usuario.

Nota: Si está utilizando Microsoft SQL Server 2005, la tabla syslogins y la tabla sysusers se implementan como vistas de compatibilidad. Estas vistas son sys.syslogins y sys.sysusers. Para obtener más información acerca de las vistas de compatibilidad, consulte el tema "Vistas de compatibilidad (Transact-SQL)" en los libros en pantalla de SQL Server 2005.

Solución alternativa


Para evitar este problema, realice una de las siguientes acciones:
  • Si las secuencias de comandos actuales están disponibles para agregar inicios de sesión, usuarios y permisos, quitar y volver a crearlos desde secuencias de comandos. Para obtener ejemplos del uso de secuencias de comandos para transferir inicios de sesión entre servidores, consulte el siguiente artículo de Microsoft Knowledge Base:
    246133 Cómo: transferir inicios de sesión y contraseñas entre instancias de SQL Server

    240872 cómo resolver problemas de permisos cuando se mueve una base de datos entre servidores SQL
  • Puede utilizar el procedimiento almacenado sp_change_users_login para volver a asociar las relaciones entre las tablas syslogins, sysusers y sysalternates. Sin embargo, el procedimiento hace estimaciones más precisas en vínculos y puede permitir a un usuario privilegios de acceso más de lo esperado. Ejecutar el procedimiento con la opción de informe primero generará una lista de usuarios que se verán afectados. Posteriormente, debe comprobar para asegurarse de que los usuarios afectados tienen los permisos adecuados. Además, tenga en cuenta que el procedimiento sp_change_users_login no soluciona problemas de permiso derivados de inicios de sesión y los usuarios creados en un orden diferente en la base de datos donde se restaura la copia de seguridad.
  • Restaurar un volcado de la base de datos master desde el momento en el volcado de la base de datos de usuario en el servidor antes de cargar la base de datos de usuario. Esta forma se asegura que toda la información de usuario en la base de datos de usuario coincide correctamente con la tabla syslogins en master.


    Advertencia: la base de datos master contiene información de todo el servidor y afecta a todas las bases de datos en el servidor. Al restaurar la base de datos master, puede encontrar identificadores de usuario adicionales y bases de datos que se han perdido o tienen permisos incorrectos. Se perderán los cambios en el patrón que se han producido desde el momento de la copia de seguridad. Sólo debe utilizar este método si tiene la certeza de que la versión de copia de seguridad de la base de datos master contiene información precisa para la base de datos de usuario en cuestión y otras bases de datos en el servidor.
  • Utilizar el Administrador de transferencia (para 6.x) o DTS (de 7.0) para copiar los inicios de sesión. Tenga en cuenta que las contraseñas no se transferirán mediante este método.
  • Póngase en contacto con su proveedor principal de soporte.