web-dev-qa-db-fra.com

SQL Server Fix Utilisateurs

Je crée un utilisateur dans ma base de données avec la commande suivante:

CREATE USER Test WITHOUT LOGIN

J'ai créé un identifiant avec le nom de test.

Je souhaite lier l'utilisateur test avec la connexion de test.

Quand j'utilise la commande suivante:

EXEC sp_change_users_login 'Update_One', 'Test', 'Test'

SQL Server Erreur ci-dessous:

Msg 15291, Level 16, State 1, Procedure sp_change_users_login, Line 114
Terminating this procedure. The User name 'Test' is absent or invalid.

Et quand j'utilise la commande suivante:

ALTER USER Test WITH LOGIN = Test

SQL Server Erreur ci-dessous:

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.

Comment puis-je relier un utilisateur de test avec la connexion à tester.

Mon objectif de ce lien: je veux restaurer une base de données d'un serveur à un autre serveur et après la restauration complète, les utilisateurs de la carte avec la connexion existante sur le serveur.

merci d'avance.

6
mehdi lotfi

Un utilisateur qui a été explicitement créé avec WITHOUT LOGIN ne peut pas être mappé à une connexion après le fait.

Un utilisateur qui a été créé avec une connexion puis a perdu son association, par ex. Parce que la base de données a été déplacée vers un autre serveur, peut être remappée en créant d'abord une nouvelle connexion (n'importe quel nom) puis à l'aide de ALTER USER ... WITH LOGIN = ... commande.

Pour démontrer, je vais créer une base de données tst puis créer un identifiant tstlogin et un utilisateur associé tstuser dans tst:

CREATE DATABASE tst;
GO
CREATE LOGIN tstlogin WITH PASSWORD = 'passw8rd';
GO
USE tst;
GO
CREATE USER tstuser FOR LOGIN tstlogin;

Pour montrer une association correcte, nous pouvons utiliser la requête suivante:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

Cela se traduit par

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin

Maintenant, nous allons laisser tomber le login tstlogin

DROP LOGIN tstlogin;

et revérifier notre utilisateur:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

qui ne montre plus de connexion associée plus:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        NULL

La prochaine étape consiste à créer une nouvelle connexion. (J'ai choisi un nom Diffenert à des fins de démonstration, mais cela pourrait aussi être le même nom.)

CREATE LOGIN tstlogin2 WITH PASSWORD = 'passw8rd';

Pour associer ce nouveau login avec notre utilisateur, nous pouvons utiliser le ALTER USER déclaration:

ALTER USER tstuser WITH LOGIN = tstlogin2;

Vérification encore une fois l'association:

SELECT DP.sid,DP.name user_name, SP.name login_name
FROM sys.database_principals AS DP
LEFT JOIN sys.server_principals AS SP
ON DP.sid = SP.sid
WHERE DP.name = 'tstuser';

montre que la déclaration ALTER a réussi:

SID                                        user_name      login_name
------------------------------------------ -------------- --------------
0xBF3D0CC874C72B469BEB4AA93845F59E         tstuser        tstlogin2

Si vous avez vraiment besoin de changer de "WITHOUT LOGIN "L'utilisateur d'être un utilisateur" avec Connexion ", vous devrez déposer cet utilisateur et le recréer. Assurez-vous que dans ce cas pour script de script des autorisations d'abord, car la suppression d'un utilisateur provoque l'oublier SQL Server.

9
Sebastian Meine