transacciones - Asignar un inicio de sesión a un usuario creado sin iniciar sesión(SQL Server)
obtener usuario de windows sql server (6)
¿Qué tipo de usuario de base de datos es? Ejecute select * from sys.database_principals
en la base de datos y compruebe las columnas type
y type_desc
para ese name
. Si es un usuario de Windows o SQL, vaya con la respuesta de @ gbn, pero si se trata de otra cosa (que es mi suposición no probada en función de su mensaje de error), entonces tiene un problema diferente.
Editar
Por lo tanto, es un inicio de sesión autenticado por SQL. Cuando sp_change_users_login
para arreglar esos inicios de sesión. SQL 2008 lo tiene como "no utilizar, se dejará de usar", lo que significa que el comando ALTER USER debería ser suficiente ... pero podría valer la pena intentarlo en este caso. Utilizado correctamente (ha pasado un tiempo), creo que esto actualiza el SID del Usuario para que coincida con el del inicio de sesión.
Tengo un usuario en mi base de datos que no tiene un inicio de sesión asociado. Parece haber sido creado sin iniciar sesión.
Cada vez que intento conectarme a la base de datos con este usuario, aparece el siguiente error:
Msg 916, Level 14, State 1, Line 1
The server principal "UserName" is not able to access the database
"DatabaseName" under the current security context.
Me gustaría especificar un inicio de sesión para este usuario para que pueda usarlo realmente para acceder a la base de datos. He intentado el siguiente script para asociar un inicio de sesión con el usuario.
USE [DatabaseName]
ALTER USER [UserName]
WITH LOGIN = [UserName]
Pero esto me da el siguiente error:
Msg 33016, Level 16, State 1, Line 2
The user cannot be remapped to a login. Remapping can only be done for users
that were mapped to Windows or SQL logins.
¿Hay alguna forma en que pueda asignar un inicio de sesión a este usuario? Me gustaría no tener que empezar desde cero porque este usuario tiene muchos permisos que necesitarían volver a configurar.
Editar: en respuesta a la pregunta de Philip Kelley, esto es lo que obtengo cuando ejecuto select * from sys.database_principals where name = ''username''
.
Disculpas por el tamaño de la imagen, tendrás que abrirla en una nueva pestaña para verla correctamente.
Edit2:
De acuerdo, he eliminado el LOGIN existente como lo sugiere gbn, y estoy usando el siguiente script para crear un nuevo LOGIN con el mismo SID que el usuario.
CREATE LOGIN [UserName]
WITH PASSWORD=N''Password1'',
DEFAULT_DATABASE=[DatabaseName],
CHECK_EXPIRATION=OFF,
CHECK_POLICY=OFF,
SID=0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390
Ahora me está dando el siguiente mensaje de error, parece que el SID es demasiado largo para el campo SID de LOGIN.
Msg 15419, Level 16, State 1, Line 1
Supplied parameter sid should be binary(16).
¿Estoy en el arroyo sin una paleta?
A través de la prueba y error, parece que si el usuario se creó originalmente "sin inicio de sesión", esta consulta
select * from sys.database_principals
mostrará authentication_type = 0 (NONE).
Aparentemente, estos usuarios no pueden volver a vincularse a ningún inicio de sesión (preexistente o nuevo, SQL o Windows) desde este comando:
alter user [TempUser] with login [TempLogin]
responde con el error de reasignación "Msg 33016" que se muestra en la pregunta.
Además, estos usuarios no aparecen en el informe de SP clásico (desaprobatorio):
exec sp_change_users_login ''Report''
Si alguien sabe cómo evitar esto o cómo cambiar authentication_type, por favor comente.
Crear un inicio de sesión para el usuario
Suelta y vuelve a crear el usuario, CON el inicio de sesión que has creado.
Hay otros temas sobre cómo replicar los permisos de su usuario. Recomiendo que aproveche la oportunidad para definir esos permisos en un Rol y llame a sp_addrolemember para agregar al usuario al Rol.
Descubrí que esta pregunta todavía era relevante pero no respondía claramente en mi caso.
Al usar SQL Server 2012 con un SQL_USER huérfano, esta fue la solución;
USE databasename -- The database I had recently attached
EXEC sp_change_users_login ''Report'' -- Display orphaned users
EXEC sp_change_users_login ''Auto_Fix'', ''UserName'', NULL, ''Password''
Usted tiene un usuario huérfano y esto no se puede reasignar con ALTER USER (todavía) porque no hay ningún inicio de sesión para mapear. Entonces, necesitas ejecutar CREAR INICIAR SESIÓN primero.
Si el usuario de nivel de base de datos es
- un inicio de sesión de Windows, la asignación se fijará automáticamente a través del AD SID
- un inicio de sesión SQL, use "sid" de sys.database_principals para la opción SID para el inicio de sesión
Luego ejecuta ALTER USER
Editar, después de comentarios y actualizaciones
El sid de sys.database_principals es para un inicio de sesión de Windows.
Por lo tanto, intentar crear y reasignar a un inicio de sesión de SQL fallará
Ejecute esto para obtener el inicio de sesión de Windows
SELECT SUSER_SNAME(0x0105000000000009030000001139F53436663A4CA5B9D5D067A02390)
sp_change_users_login
está en desuso.
Mucho más fácil es:
ALTER USER usr1 WITH LOGIN = login1;