La connexion a déjà un compte sous un nom d'utilisateur différent

29

Lorsque j'exécute ce SQL:

USE ASPState
GO
IF NOT EXISTS(SELECT * FROM sys.sysusers WHERE NAME = 'R2Server\AAOUser')
CREATE USER [R2Server\AAOUser] FOR LOGIN [R2Server\AAOUser];
GO

J'obtiens l'erreur suivante:

La connexion possède déjà un compte sous un nom d'utilisateur différent.

Comment savoir quel est ce nom d'utilisateur différent pour mon compte de connexion?

Jack
la source

Réponses:

31

Cela signifie que la connexion [R2Server \ AAOUser] est déjà mappée à un utilisateur dans cette base de données. Ou, en d'autres termes, un autre utilisateur de base de données utilise cette connexion. Vous pouvez voir quel utilisateur de base de données utilise votre connexion avec la requête suivante:

use YourDB
go
SELECT su.name as DatabaseUser
FROM sys.sysusers su
join sys.syslogins sl on sl.sid = su.sid
where sl.name = 'test' -- login

PS: une version du script qui n'utilise pas les vues de compatibilité:

Select sp.name as LoginName, sp.type_desc as LoginType,
    dp.name as DBUser, dp.type_desc as UserType
from sys.server_principals sp
join sys.database_principals dp on dp.sid = sp.sid
where sp.name = 'test' -- your login
Marian
la source
Ok, je vois la valeur dboaffichée. Étrange, je ne me souviens pas avoir utilisé le dbopour mon compte R2Server\AAOUser. Vous vous demandez ce que je dois faire ensuite.
Jack
4
Avez-vous créé la base de données en utilisant cette connexion pour vous connecter au serveur? Si oui, vous en êtes le propriétaire et vous n'avez pas besoin de créer un autre utilisateur. Vous êtes déjà prêt.
Marian
En fait, j'ai utilisé la commande aspnet_regsql -E -S .\MSSQLSERVER_R2 -ssaddpour créer la ASPStatebase de données. Je pense que probablement, je suis déjà prêt, même si je ne le réalise même pas en premier lieu.
Jack
Devinez quoi: "-E -> Authentifier avec les informations d'identification Windows actuelles." :-)
Marian
4
J'utiliserais sys.server_principalset sys.database_principals. sysuserset sysloginsne sont là que pour la compatibilité descendante.
Aaron Bertrand
4

C'est une «chose de métadonnées» ...

Parfois, l'utilisateur de la base de données est «corrompu» au cours de tout ce qui se passe dans cette base de données. (J'ai vu un comportement similaire si la base de données est restaurée et que les rôles dans la copie restaurée diffèrent de celui que vous avez superposé. C'est pourquoi j'ai essayé ci-dessous, ce qui a résolu le problème pour moi.)

  1. Ouvrez les propriétés de connexion dans SSMS -> (Sécurité | Connexions | ID utilisateur défaillant | Propriétés | Mappage utilisateur). Vous verrez probablement les bases de données déjà vérifiées et des rôles sont attribués (comme parfaitement normal).

  2. Notez les autorisations sur la base de données donnant l'erreur, juste pour référence.

  3. Décochez cette base de données et enregistrez la connexion.
  4. Réexécutez maintenant votre requête pour ajouter la connexion / le rôle dans la base de données cible. Il devrait fonctionner parfaitement.
CK dans CLE
la source
2
quand j'arrive à l'étape 3, j'obtiens:Cannot drop the user 'dbo'. (Microsoft SQL Server, Error: 15150)
bkwdesign
J'ai également reçu le Cannot drop the user 'dbo'.message d'erreur. J'ai couru ce script, qui a supprimé le mappage utilisateur problématique et résolu le problème: USE DATABASE_NAME; ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [sa]. Pour plus d'informations, voici
SherlockSpreadsheets