24/8/18

Solucion al error: 15023 de Microsoft SQL Server

Esta semana me encontré con el siguiente caso:

El área de desarrollo de una empresa mantiene un aplicativo el cual depende de una base de datos, los desarrolladores tienen como practica, hacer un respaldo de la base productiva diariamente, enviarla a otro servidor SQL y restaurarla allí para realizar pruebas. Ambos servidores SQL tienen configurada la autenticación en modo Mixto, es decir con usuarios locales y usuarios de Active Directory. Al restaurar la base en el servidor de testing todos los permisos se mantienen para los usuarios de AD, pero los permisos de usuarios locales se pierden a pesar de existir un usuario local con el mismo nombre en el servidor de testing. Y si intentas otorgarle el permiso recibes el siguiente mensaje de error:
.

User, group, or role 'usuario' already exists in the current database. (Microsoft SQL Server, Error: 15023)
.
Para solucionarlo, si la situación de ustedes es un caso puntual, es decir una base de datos que no se restaurará diariamente, lo que deben hacer es una query sobre la base con el siguiente formato:
.
USE Nombre_de_la_base
EXEC sp_change_users_login 'Auto_Fix', 'usuario'

En el siguiente ejemplo cargo la base de nombre "Productiva", y reparo el login del usuario "JManzur".

USE Productiva
EXEC sp_change_users_login 'Auto_Fix', 'JManzur'


Clic en la imagen para agrandar.
Hecho esto podemos asignar los permisos del modo habitual y no recibiremos error.

Para mí caso particular requería crear una tarea que lo solucionara diariamente luego del restore de la base y que ademas asignara el permiso requerido. Lo que hice fue crear un Job de la siguiente forma:



El comando para la asignacion de permisos es el siguiente:

Formato:
  • EXEC sp_addrolemember db_permiso, usuario

Ejemplo: Asigno permisos de lectura al usuario "JManzur".
  • EXEC sp_addrolemember db_datareader, JManzur
Para finalizar en la opción "schedules", de la ventana principal se define según lo requerido:

Clic en la imagen para agrandar.
Y con esto queda solucionado.

En caso de que el acceso a restaurar sea el de un usuario del dominio, el comando seria el siguiente:
  • USE [Nombre_de_la_base]
  • GO 
  • CREATE USER [Dominio\Usuario] FOR LOGIN [Dominio\Usuario]
  • GO
  • USE [Nombre_de_la_base]
  • GO
  • EXEC sp_addrolemember N'db_permiso', N'Dominio\Usuario'
  • GO

3 comentarios :