Uno de los problemas más comunes cuando restauramos una base de datos de otro SQL es el de los usuarios huérfanos, vamos a ver por qué sucede y cómo solucionarlo. Antes de empezar quiero pedir perdón por el chiste malo de la foto de portada. Una vez hecho vamos a ver un poco de teoría para entender el por qué del problema y veamos como solucionarlo.
Usuarios y Logins en SQL Server
Tenemos que diferenciar los logins para acceder al servidor de los usuarios de bases de datos. Es un poco complicado, pero cuando nosotros creamos un login (inicio de sesión) sólo tendrá acceso a SQL Server sin acceder a las bases de datos. Para acceder a las bases de datos necesitaremos un usuario creado en esa base de datos y enlazado al login del servidor.
En SQL Server tenemos dos tipos de usuarios, usuarios de windows y usuarios de SQL. Esos usuarios tienen un nombre que vemos y un identificador único con el que trabaja SQL Server. En el caso de los usuarios de windows se usa el identificador (SID) de windows (gestionado por el directorio activo o por el equipo). En el caso de los usuarios de SQL se creará un SID para el login y se usará ese mismo SID para crear un usuario en las bases de datos a las que se conceda acceso.
Usuarios huérfanos
Sabiendo ya la diferencia entre usuarios y logins es sencillo entender el problema. Un usuario huérfano es un usuario sin login asociado. Como hemos comentado esto es muy común a la hora de mover bases de datos de un servidor a otro, pues aunque tengan los mismos usuarios lo normal es que no tengan los mismos SID. Puede pasar también en un mismo servidor, por ejemplo si borramos un login, lo volvemos a crear y no borramos los usuarios para recrearlos desde el nuevo login.
Arreglar usuarios huérfanos
Cuando nos encontramos con este error, no podremos dar permisos al login sobre la base de datos porque aunque no tengan el mismo SID ya hay un usuario con ese nombre y los nombres de usuario deben ser únicos. La solución tampoco sería borrar el usuario para crearlo desde la ventana de logins porque perderíamos todos los permisos asignados en la base de datos y habría que volver a hacer ese trabajo. Para cuando esto pasa, SQL Server tiene una herramienta, en forma de procedimiento almacenado de sistema que localiza y corrige los usuarios huérfanos.
Ejemplo
Como veréis en las siguientes capturas, en mi base de datos de pruebas tengo los usuarios Batman, Spiderman, Harry Potter y Superman pero en el servidor solo tengo el login Spiderman. Todos los usuarios de base de datos son huérfanos, los 3 primeros porque no existe su login padre y Superman porque, aunque existe, no están enlazados.


Localizar usuarios huérfanos
Usaremos el procedimiento almacenado con el parámetro report para localizar los usuarios huérfanos.
EXEC sp_change_users_login 'Report'
Como era de esperar el resultado del reporte nos muestra nuestros cuatro usuarios huérfanos.

Usuario y login existentes sin relación
Para corregir el problema usaremos el procedimiento almacenado con el parámetro Auto_Fix. En caso de que exista un login con el mismo nombre que nuestro usuario bastará con poner el nombre del usuario y se enlazarán.
EXEC sp_change_users_login 'Auto_fix', 'superman'

No existe el login
Cuando no exista un login con el mismo nombre podremos usar también el parámetro Auto_Fix, esta vez lo acompañaremos del nombre de usuario y la contraseña para el login que vamos a crear.
EXEC sp_change_users_login 'Auto_fix', 'batman', NULL, 'BatContr@seña.123'

Conclusión
Hoy has aprendido qué son y por qué se producen los usuarios huérfanos y, lo más importante, como corregir este problema que es uno de los más comunes en bases de datos SQL Server. Como siempre para cualquier duda o sugerencia te emplazo dejarlo en los comentarios, mi email o nuestro twitter.


[…] el anterior post aprendimos lo que eran y cómo corregir el problema de usuarios huérfanos, sin embargo, como es mejor prevenir que curar, vamos a aprender cómo prevenir el […]
[…] bases de datos entre distintos servidores SQL Server, es común encontrarse con un problema de usuarios huérfanos ya que los sid de los logins pueden diferir entre los distintos servidores. Para evitar este […]
[…] Los usuarios se utilizan para gestionar permisos dentro de una base de datos, controlando el acceso a tablas, procedimientos almacenados y otros objetos. Cada usuario de base de datos puede estar asociado a un inicio de sesión o no, pero un inicio de sesión puede estar asociado a múltiples usuarios en diferentes bases de datos. Cuando un usuario no está asociado a un inicio de sesión decimos que está huérfano. […]