2012-09-04 12 views
14

Ho recentemente aggiornato il mio ambiente di sviluppo da SQL 2000 a SQL 2008 R2. Ho eseguito un backup del nostro db di produzione e l'ho ripristinato il nostro nuovo server di sviluppo.SQL esegue il login ad un utente esistente

Ho creato un login sul server di sviluppo che rispecchia il login che utilizzo sul server di produzione, ma non riesco a farlo mappare all'utente 'dbo' nel database. Quando ho modificare le proprietà del login in 'Mapping utenti", sostituisco l'utente con 'dbo', e ottengo il seguente errore:?

TITLE: Microsoft SQL Server Management Studio Create failed for User 'dbo'. (Microsoft.SqlServer.Smo) An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo) User, group, or role 'dbo' already exists in the current database. (Microsoft SQL Server, Error: 15023)

Così come faccio a mappare una login di un utente esistente

+6

C'è il comando [Alter user] (http://msdn.microsoft.com/en-us/library/ms176060.aspx): 'alter utente xyz con login = [dominio \ nome utente]' –

+1

Elimina e ricrea il utente – Paparazzi

+0

Se la risposta che ho fornito è stata sufficiente per risolvere il problema, ti dispiacerebbe contrassegnarlo come la soluzione corretta? Ecco un link a meta con maggiori informazioni. http://meta.stackexchange.com/a/5235/256426 – jwhaley58

risposta

12

di conciliare il l'utente con il login, è possibile utilizzare il sistema di stored procedure sp_change_users_login

sp_change_users_login [ @Action = ] 'action' 
[ , [ @UserNamePattern = ] 'user' ] 
[ , [ @LoginName = ] 'login' ] 
[ , [ @Password = ] 'password' ]; 

Ad esempio:.

EXEC sp_change_users_login 'Update_One','User123','User123'

Se molti utenti non sono sincronizzati, è possibile utilizzare un cursore per estrarre tutti gli utenti ed eseguire questo comando. Non c'è alcun effetto negativo sull'esecuzione di questo contro utenti che non sono fuori sincrono e correggerà tutti gli utenti orfani.

DECLARE @sql NVARCHAR(MAX); 
DECLARE curSQL CURSOR 
FOR 
     SELECT 'EXEC sp_change_users_login ''UPDATE_ONE'', ''' + name + ''', ''' + name + '''' 
     FROM  sysusers 
     WHERE issqluser = 1 
       AND name NOT IN ('guest', 'dbo', 'sys', 'INFORMATION_SCHEMA') 
OPEN curSQL 
FETCH curSQL INTO @sql 
WHILE @@FETCH_STATUS = 0 
    BEGIN 
      EXEC (
      @sql 
      ) 
      FETCH curSQL INTO @sql 
    END 
CLOSE curSQL 
DEALLOCATE curSQL 

Questo deve essere eseguito dal contesto del database è necessario gli utenti fissati.

+0

Ho dimenticato di dire che questo è il risultato di avere utenti con SID che non sono sincronizzati. Ho riscontrato questo problema durante il ripristino di un database in un nuovo server in cui ho creato un account di accesso identico al server originale, ma il SID che viene generato sarà diverso, quindi SQL Server non può riconciliare l'utente con il suo accesso.C'è un componente in Integration Services in grado di risolvere questo problema in modo permanente, ma impara dal mio dolore, disabilita l'utente e sovrascrive la password. – jwhaley58

+0

Quando eseguo la query ottengo: Deve dichiarare la variabile scalare "@sql". – YesMan85

+0

Non riesco a credere che sia passato così tanto tempo senza che sia stato catturato. Mi dispiace per quello Ha solo bisogno di quella variabile da dichiarare. L'ho aggiunto alla sceneggiatura. – jwhaley58

8

Penso commento di Nikola Markovinović a questo post deve essere aggiunto come una risposta. Utilizzare il comando utente Alter:

USE {database}; 
ALTER USER {user} WITH login = {login} 

Dove:

  • {dati}: Il database che contiene l'utente orfano
  • {user}: il nome utente orfano
  • {login}: La nome di login. È possibile utilizzare lo stesso login come usato sul vecchio server o mappare l'utente a un nome di accesso diverso

ho trovato questa risposta a http://www.aip.im/2010/05/re-map-database-user-to-login-in-sql-server-after-restoring-or-attaching-database/#sthash.fbazv94Z.dpuf

0

In SQL Server 2012, l'utente 'dbo' non può essere modificata .

Problemi correlati