Errore di SQL Server 2008 R2: 15023, l'utente, il gruppo o il ruolo esiste già


16

Ho un database di test con cui sto riscontrando problemi con le autorizzazioni.
Non riesco ad accedere al database di report e la documentazione della guida dell'applicazione dice che:

Resolution: 

1. Launch the SQL Server Management Studio and connect to the database server(s) hosting   the Vision and Reporting Server databases. 
2. Expand the security folder. 
3. Select logins and right click on the <username> user and choose properties. 
4. Click the User Mapping tab 
5.Make sure the following databases are selected in the Users mapped to this Login:

    ReportServer
    ReportServerTempDB
    Your Vision databases
    This maps the login/user to the respective databases.
6. As you select each database (including your Vision database), select the db_owner role in the Database role membership for: section. You must select this option for each database.

Quando lo faccio, ricevo il seguente errore:

"Create failed for user '<servername>\<username>'.  User, group, or role '<servername>\<username>' already exists in the current database. (Microsoft SQL Server, Error: 15023)"

Ho cercato su Google questo errore e ho provato il seguente comando su ciascun database:

 ALTER USER [<username>] WITH LOGIN = [<username>] 

Il messaggio indicava che i comandi sono stati completati correttamente ma sto ancora ricevendo l'errore precedente quando provo a mappare ciascun database come indicato sopra.

Cosa mi sto perdendo?

Per il commento di Kin (grazie) Ho provato questo: - Ho fatto clic con il pulsante destro del mouse sull'utente e selezionato: Script Accedi come> Rilascia e crea in> Nuova finestra di query. - Ho eseguito la query risultante e ho provato a mappare i ruoli utente selezionando di nuovo gli altri due database e db_owner ma sto ancora ricevendo lo stesso messaggio di errore di cui sopra.

Pensieri??

Risposte:


12

Esistono diverse cose che puoi provare e il successo di ciascuna dipenderà probabilmente dal ruolo del server che hai.

Per i principianti, se sono solo uno o due utenti, onestamente, il modo più semplice è eliminare l'utente del database dal database ripristinato e, purché sia ​​già presente un accesso al server esistente, rimappare l'utente del database all'accesso al server utilizzando SSMS. Se il login del server non esiste, basta crearlo, mappare l'utente e presto! Andiamo via.

Opzione successiva: se stai migrando un gran numero di utenti, usa sp_help_revlogin. sp_help_revlogin è una procedura memorizzata fornita da Microsoft che aiuterà a migrare gli accessi da un server all'altro, inclusi password e SID. Ecco un buon articolo a riguardo SP_HELP_REVLOGIN


Vedere support.microsoft.com/en-us/kb/918992 Come trasferire accessi e password tra istanze di SQL Server
James Jenkins

3

Uso Auto_Fix con sp_change_users_loginnel mio ambiente di sviluppo per risolvere tali problemi (errore 15023). Evitare di utilizzare Auto_Fix in situazioni sensibili alla sicurezza.

Correzione automatica: collega una voce utente nella vista del catalogo di sistema sys.database_principals nel database corrente a un account di accesso di SQL Server con lo stesso nome. Se non esiste un accesso con lo stesso nome, ne verrà creato uno. Esaminare il risultato dall'istruzione Auto_Fix per confermare che è stato effettivamente creato il collegamento corretto. Evitare di utilizzare Auto_Fix in situazioni sensibili alla sicurezza.

sp_change_users_login 'AUTO_FIX', 'myuser'

Si noti inoltre che questa funzionalità potrebbe essere rimossa in una versione futura di Microsoft SQL Server.

Altri riferimenti:

  1. L'utente, il gruppo o il ruolo di SQL Server 2008 esiste già nel database corrente
  2. FIX: errore 15023: l'utente esiste già nelle banche dati correnti
  3. SQL associa un accesso a un utente esistente

0
ALTER USER [<username>] WITH LOGIN=[<username>]

È l'approccio giusto.

Altrimenti vai a:

Sicurezza> Login> (nome utente)> Proprietà> Mappatura utente

inserisci qui la descrizione dell'immagine

e rimappa tale utente nel database desiderato.

È possibile utilizzare la seguente query nel contesto del database per verificare la presenza di orfani:

select
    dp.name [user_name]
    ,dp.type_desc [user_type]
    ,isnull(sp.name,'Orhphaned!') [login_name]
    ,sp.type_desc [login_type]
from   
    sys.database_principals dp
    left join sys.server_principals sp on (dp.sid = sp.sid)
where
    dp.type in ('S','U','G')
    and dp.principal_id >4
order by sp.name

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.