Permisos de usuario en mal estado después de una copia de seguridad -> Operación de restauración

11

Tuve que mover varias bases de datos de SQL Server 2008 a nuestro nuevo servidor db, así que hice una copia de seguridad de todos ellos (en archivos .bak), copié estos archivos en el nuevo cuadro y los restauré (todo con SQL Management Studio).

Todo salió bien, pero ahora encuentro que no puedo iniciar sesión en ninguna de las bases de datos utilizando la cuenta de SQL Server que continúa funcionando en el antiguo RDBMS. Mi inicio de sesión autenticado con Windows todavía funciona bien por cierto.

Tenía la idea de que los usuarios y los permisos se duplicarían sin problemas en el nuevo servidor de la base de datos, pero parece que algo salió mal en alguna parte. Agradecería comentarios / sugerencias / ofertas de ayuda ;-)

5arx
fuente

Respuestas:

7

Veo que ya encontró una solución a su problema, una cosa que noté en su pregunta original fue que todavía tenía acceso al servidor anterior.

La siguiente pregunta sobre SO tuvo un problema similar e incluye enlaces a un artículo de Microsoft con un script para generar los permisos del usuario.

/programming/461385/restoring-a-backup-to-a-different-server-user-permissions

(Recurso listado para esa pregunta http://support.microsoft.com/kb/918992 )

Parece que cambiar la configuración del servidor de autenticación de Windows a autenticación de modo mixto solucionó su problema, pero en caso de que no lo resolviera por completo, pensé que esto podría ser útil.

Jeff
fuente
Estoy seguro de que esta no será la primera vez que pelearé con SQL Server sobre los usuarios / permisos, así que marcaré el artículo para la posteridad. Muchas gracias por publicar.
5arx
6

Esto se conoce como "usuarios huérfanos". Aquí hay 2 formas de solucionarlo

  1. Si puede, restaure la base de datos maestra original como "loginsource" y sys.server_principals tiene suficiente información para generar todos los inicios de sesión de SQL Server y Windows. Es decir, los SID y la contraseña cifrada

  2. Si usa solo inicios de sesión de Windows, puede ejecutar esto por base de datos para generar un script

Guión:

SELECT
    'CREATE LOGIN [' + SUSER_SNAME(sid) + '] FROM WINDOWS'
FROM
    sys.database_principals
WHERE
    [type] IN ('G', 'U')
gbn
fuente
Gracias por su respuesta: mi aplicación web usa inicios de sesión de SQL mientras que nuestras cuentas de Windows se usan con fines administrativos. No puedo ver una manera de restaurar como 'loginsource', como sugieres, ¿podrías explicarlo? ¿ Espero que todo esto se pueda hacer con Managment Studio?
5arx
PD. Seguí este documento: support.microsoft.com/kb/274188 y ejecuté todos los scripts (aparentemente) con éxito. Pero nada ha cambiado.
5arx
5

Idealmente, debería escribir los usuarios y permisos antes de hacer la restauración. Si eso no ha sucedido, entonces debe solucionar las cosas después del hecho, y es probable que se pierda algo, pero debería poder llegar al 90% del camino.

Lo primero que debe determinar es si existen los mismos inicios de sesión en el nuevo servidor. Si no lo hacen, entonces debe averiguar si está bien que los inicios de sesión se creen en el nuevo servidor. Nunca suponga que deberían crearse, podría haber una buena razón de por qué no existían en primer lugar. Luego puede crearlos cavando a través de la tabla sysusers.

Puede corregir a los usuarios huérfanos ejecutando algo similar a lo siguiente:

DECLARE @username varchar(25), @loginsid varbinary(85)
DECLARE fixusers CURSOR
FOR
SELECT UserName = name 
    FROM sysusers
    WHERE issqluser = 1 
    and (sid is not null and sid <> 0x0)
    and suser_sname(sid) is null
    and name in (select name from master..syslogins)
    ORDER BY name
OPEN fixusers
FETCH NEXT FROM fixusers
INTO @username
WHILE @@FETCH_STATUS = 0
BEGIN
    EXEC sp_change_users_login 'update_one', @username, @username

    FETCH NEXT FROM fixusers
    INTO @username
END CLOSE fixusers
DEALLOCATE fixusers 

Este código funcionará para SQL2008, pero fue escrito para ser compatible con versiones anteriores de SQL2000.

SQLRockstar
fuente
Gracias por el guion. ¿Puedo suponer que no hay forma de hacerlo en Management Studio? Además, algunas personas sugieren que elimine y vuelva a crear los usuarios de nivel DB: ¿se recomienda?
5arx
Esto supone que los inicios de sesión ya existen y solo empareja los SID
gbn
¿sp_change_users_login no actualiza el SID? msdn.microsoft.com/en-us/library/ms174378.aspx
SQLRockstar
5arx: no hay forma de hacer esto en SSMS. Como dije, en una situación ideal, habría programado sus permisos antes de la restauración. En este punto, necesita recrear a mano o tratar de armar las cosas manualmente usted mismo. si fuera usted, restauraría el viejo db, escribiría los permisos, haría la restauración desde el otro servidor y luego volvería a hacer sus permisos.
SQLRockstar
"Update_One: vincula al usuario especificado en la base de datos actual a un inicio de sesión existente de SQL Server. El usuario y el inicio de sesión deben especificarse. La contraseña debe ser NULL o no especificada". Por lo tanto, se supone que ya existen inicios de sesión.
gbn 23/03/11