The server principal already exists. Error 15025 SQL Server

logo_gpsEl error 15025The server principal already exists es uno de los más comunes cuando se trabaja con SQL Server. Hoy vamos a enseñaros por qué ocurre el error y como corregirlo.

¿Por qué aparece The server principal already exists?

Este error lo que indica es que “el login que se quiere crear ya existe”:

the server principal already exists error 15025

Es entonces cuando nos ponemos a investigar si realmente es cierto. Para ello podremos usar las siguientes consultas, para SQL Server 2005 y superiores:

SELECT * FROM master.sys.sql_logins where name='login_a_buscar';

Para SQL Server 2000:

SELECT * FROM master.sys.syslogins where name='login_a_buscar';

Si realmente está creado no debemos hacer nada más pero, ¿y si “no está creado”?.

Uno de los atributos del login es el SID. Este SID es un identificador único y posiblemente sea el causante de nuestro problema. Supongamos que tenemos un usuario de dominio de Windows que antes se identificaba como “dominio\aperez”. Debido a unos cambios en la empresa ahora se identifica con el número de empleado. En este caso el nombre es distinto pero usa el mismo SID. Es por eso por lo que no nos deja crearlo en SQL Server, porque para la base de datos ya existe, sigue siendo el mismo usuario.

¿Cómo corregirlo?

En primer lugar,
debemos saber cuál es el SID del login “antiguo” con:

select suser_sid ('dominio\aperez');

Esta consulta nos devolverá el SID, que es parecido a:

0x0105000000000005150000000C04XXXXXXXXXXXXXXXXXXXXXXXXX

Una vez que tenemos el SID, comprobaremos que está asociado al login antiguo y obtenemos todos sus datos:

select * from sys.server_principals sp where sid=0x0105000000000005150000000C04XXXXXXXXXXXXXXXXXXXXXXXXX

Una vez que tenemos localizado el login, mediante SQL Sever Management Studio nos ponemos sobre él y seleccionamos “Incluir inicio de sesión como –> DROP and CREATE to –> Nueva ventana del editor de consultas”. Esta acción nos abrirá una nueva ventana en la que nos generará el código necesario para borrar y volver a crear el login con los permisos a nivel de servidor que tenga el login antiguo. Este código lo deberemos modificar remplazando el nombre del login antiguo por el nuevo en el create. Así podremos generar el nuevo login con las mismas características del anterior. Por ejemplo:

USE [master]
GO
DROP LOGIN [dominio\aperez]
GO
CREATE LOGIN [dominio\E2572] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [dominio\E2572]
GO

Una vez hecho esto si repetimos la consulta anterior:

select * from sys.server_principals sp where sid=0x0105000000000005150000000C04XXXXXXXXXXXXXXXXXXXXXXXXX

Obtendremos el nuevo login creado.

Esperemos que os haya servido de ayuda, puedes ver cómo vincular logins huérfanos en SQL Server en este artículo.

Nos vemos en próximas entradas,

Equipo de base de datos

Fuentes:

https://social.technet.microsoft.com/wiki/contents/articles/24947.sql-server-troubleshooting-the-server-principal-already-exists-msg-15025-level-16-state-2-line-1.aspx

https://www.techonthenet.com/sql_server/questions/find_logins.php