En esta entrada vamos a ver los problemas que nos pueden surgir cuando migramos una base de datos de un servidor a otro. Normalmente, al migrar nos encontramos con la problemática de que los usuarios a nivel de base de datos viajan con el backup que vamos a restaurar, en cambio los inicios de sesión no. Para ello vamos a ver cómo podemos hacer para establecer el inicio de sesión del antiguo servidor y asociarlo con el usuario de la base de datos.

Lo que queremos hacer

En este caso y para nuestro ejemplo vamos a introducir primero el escenario. Tenemos una instancia de SQL Server 2008 por defecto con un inicio de sesión llamado epuig. Este inicio de sesión será el que utilizaremos para conectar a las instancias.

Además también vamos a tener una base de datos llamada testLogins que va a tener un usuario que se llamará también epuig.

Por otro lado tenemos una instancia SQL Server 2008 llamada DEV1 en la cual vamos a restaurar nuestra base de datos testLogins.

Migrando

Para ello lo primero que debemos realizar es una copia de seguridad de la BD:

BACKUP DATABASE [testLogins] TO
DISK = N'C:BackupstestLogins.bak'
WITH NOFORMAT, INIT, NAME = N'testLogins-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
GO

Una vez tenemos nuestro backup, procedemos a realizar la restauración en nuestra nueva instancia. Para ello ejecutamos le siguiente comando:

RESTORE DATABASE [testLogins] FROM  DISK = N'C:BackupstestLogins.bak'
WITH  FILE = 1,  MOVE N'testLogins' TO N'C:DBstestLogins.mdf',
MOVE N'testLogins_log' TO N'C:DBstestLogins_log.ldf',  NOUNLOAD
GO

De modo que ya tenemos nuestra base de datos copiada en otro servidor con nuestro usuario de base de datos epuig que está incluido en la copia de seguridad.

En cambio, los inicios de sesión del nuevo servidor no se han modificado para nada:

 

Creando nuevos inicio de sesión en el nuevo servidor

Puesto que la intención de cambiar la base de datos de servidor es seguir ofreciendo el servicio, hay que crear un inicio de sesión para epuig tal y como lo tenía en el anterior servidor. Para ello basta con ejecutar el siguiente comando:

CREATE LOGIN [epuig] WITH PASSWORD=N'epuig',
DEFAULT_DATABASE=[testLogins], CHECK_EXPIRATION=OFF
GO

Una vez ejecutado ya tenemos nuestro inicio de sesión:

Por lo cual ya deberíamos de poder iniciar sesión y conectar con la base de datos testLogins. Vamos a probar a conectar y nos aparece el siguiente error:

La solución

El mensaje nos indica que el usuario no puede acceder a su base de datos por defecto y que no se puede iniciar sesión en la instancia de SQL Server. Cuando nos pase esto, debemos comprobar que el inicio de sesión y el usuario estén siempre bien enlazados. Para ello existe una columna llamado SID que establece la relación entre el inicio de sesión y el usuario de base de datos. Vamos pues a comprobar que nuestro nuevo inicio de sesión y el usuario que venía de la copia de seguridad están enlazados, para ello lanzamos los siguientes comandos:

EL SID del login epuig:

select loginname,sid from sys.syslogins
where name = 'epuig'

Y como resultado obtenemos el SID: 0x238682DFE20E9640B6405976C06AC6E1

Ahora vamos a ver el SID usuario epuig de testLogins:

use testLogins
go
select name,sid from sys.database_principals
where name='epuig'

Y obtenemos que el SID del usuario de la BD es: 0x651B368CF03AB1478B29D3A7CF2E0738

Como veis, los SID son diferentes, por lo cual el inicio de sesión que habíamos creado no está correctamente asociado al usuario de base de datos y es por este mismo motivo por el cual no podemos conectar. Para solucionar esto, lo que debemos hacer es crear el inicio de sesión con el mismo SID que posee el usuario epuig de la BD testLogins. Para ello ejecutamos el siguiente script:

DROP LOGIN epuig
go

CREATE LOGIN [epuig] WITH PASSWORD=N'epuig',
CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF,DEFAULT_DATABASE=[testLogins],
SID=0x651B368CF03AB1478B29D3A7CF2E0738
Go

Ahora ya sí que tenemos vinculado inicio de sesión y usuario y por lo tanto ya podemos conectar correctamente como se muestra en la siguiente captura. La instancia SQL2008_DEV1 conectada con epuig.

Conclusión

Cada vez que migremos una base de datos y restauremos los inicios de sesión del antiguo servidor, tenemos que asegurarnos de que los SID coincidan, sino tendremos problemas para conectar con la nueva instancia. Además, recuerda que el hecho de que el nombre de inicio de sesión ya exista en el servidor no es garantía de que la asociación del SID del inicio de sesión y del usuario de base datos va a ser correcta.