L'accesso ha già un account con un nome utente diverso


29

Quando eseguo questo SQL:

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

Ottengo il seguente errore:

L'accesso ha già un account con un nome utente diverso.

Come faccio a sapere qual è questo diverso nome utente per il mio account di accesso?

Risposte:


31

Ciò significa che il login [R2Server \ AAOUser] è già associato a un utente in quel database. O, in altre parole, un altro utente del database sta usando questo accesso. Puoi vedere quale utente del database sta usando il tuo login con la seguente query:

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: una versione dello script che non utilizza le visualizzazioni di 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

Ok, vedo il valore dbovisualizzato. Strano, non ricordo di aver usato il dboper il mio account R2Server\AAOUser. Mi chiedo cosa dovrei fare dopo.
Jack,

4
Hai creato il database usando quel login per collegarti al server? Se sì, allora ne sei il proprietario db e non devi creare un altro utente. Sei già pronto.
Marian,

In realtà, ho usato il comando aspnet_regsql -E -S .\MSSQLSERVER_R2 -ssaddper creare il ASPStatedatabase. Penso che probabilmente sono già pronto, anche se in primo luogo non me ne rendo conto.
Jack,

Indovina cosa: "-E -> Autentica con le credenziali di Windows correnti." :-)
Marian,

4
Vorrei usare sys.server_principalse sys.database_principals. sysuserse sysloginssono lì solo per compatibilità con le versioni precedenti.
Aaron Bertrand

4

È una "cosa da metadati" ...

A volte l'utente del database viene "corrotto" nel corso di tutto ciò che accade in quel DB. (Ho visto un comportamento simile se il DB viene ripristinato e i ruoli nella copia ripristinata differiscono da quello contenuto in quella sovrapposta. Ecco perché ho provato di seguito, il che ha risolto il problema per me.)

  1. Aprire le proprietà di accesso in SSMS -> (Sicurezza | Login | UserID fallito | Proprietà | Mappatura utente). Probabilmente vedrai i DB già controllati e i ruoli assegnati (come perfettamente normale).

  2. Nota le autorizzazioni sul DB che dà l'errore, solo per riferimento.

  3. Deseleziona quel DB e salva il login.
  4. Ora rieseguire la query per aggiungere il login / ruolo nel DB di destinazione. Dovrebbe funzionare bene.

2
quando arrivo al passaggio 3, ottengo:Cannot drop the user 'dbo'. (Microsoft SQL Server, Error: 15150)
bkwdesign,

Ho anche ricevuto il Cannot drop the user 'dbo'.messaggio di errore. Ho eseguito questo script, che ha rimosso la mappatura utente problematico e ha risolto il problema: USE DATABASE_NAME; ALTER AUTHORIZATION ON DATABASE::DATABASE_NAME TO [sa]. Per ulteriori informazioni questa è la fonte che ho usato: blog.sql-assistance.com/index.php/cannot-drop-the-user-dbo
SherlockSpreadsheets
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.