Trasferimento di accessi e password tra istanze di SQL Server

IMPORTANTE: il presente articolo è stato tradotto tramite un software di traduzione automatica di Microsoft ed eventualmente revisionato dalla community Microsoft tramite la tecnologia CTF (Community Translation Framework) o da un traduttore professionista. Microsoft offre articoli tradotti manualmente e altri tradotti automaticamente e rivisti dalla community con l’obiettivo di consentire all'utente di accedere a tutti gli articoli della Knowledge Base nella propria lingua. Tuttavia, un articolo tradotto automaticamente, anche se rivisto dalla community, non sempre è perfetto. Potrebbe contenere errori di vocabolario, di sintassi o di grammatica. Microsoft declina ogni responsabilità per imprecisioni, errori o danni causati da una traduzione sbagliata o dal relativo utilizzo da parte dei clienti. Microsoft aggiorna frequentemente il software e gli strumenti di traduzione automatica per continuare a migliorare la qualità della traduzione.

Clicca qui per visualizzare la versione originale in inglese dell’articolo: 918992
INTRODUZIONE
In questo articolo viene descritto come trasferire gli account di accesso e le password tra istanze di Microsoft SQL Server 2005 Microsoft SQL Server 2008 e di Microsoft SQL Server 2012 su server diversi.

Per ulteriori informazioni sul trasferimento di accessi e password tra istanze di altre versioni di SQL Server, fare clic sul numero dell'articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
246133Trasferimento di accessi e password tra istanze di SQL Server
Informazioni
In questo articolo, il server a e b sono diversi server. Inoltre sia il server a server b sono in esecuzione SQL Server 2005.

Nota Queste informazioni si applicano anche per il 2008 SQL Server e SQL Server 2012.

Dopo aver spostato un database dall'istanza di SQL Server su un server per l'istanza di SQL Server nel server B, gli utenti potrebbero essere in grado di accedere al database sul server B. inoltre, gli utenti potrebbero ricevere il seguente messaggio di errore:
Accesso non riuscito per l'utente 'MyUser'. (Microsoft SQL Server, errore: 18456)
Questo problema si verifica perché è non è stato trasferire gli account di accesso e le password dall'istanza di SQL Server sul server all'istanza di SQL Server sul server B.

Per trasferire gli account di accesso, utilizzare uno dei metodi seguenti, a seconda della situazione.

Metodo 1: L'accesso utilizzando la password di pre-SQL Server 2000

Per risolvere il problema, chiedere all'utente di accedere al server che esegue SQL Server utilizzando l'account di accesso di pre-SQL Server 2000.

Nota L'hashing della password viene aggiornato automaticamente quando l'utente accede utilizzando la password di pre-SQL Server 2000.

Metodo 2: Reimpostare la password in SQL Server

Per risolvere questo problema, reimpostare la password in SQL Server e quindi uno script di accesso.

Nota Quando si reimposta la password, viene utilizzato l'algoritmo di hash di password.

Metodo 3: Creare un registro in uno script che dispone di una password vuota

Per creare un registro in uno script che ha una password vuota, attenersi alla seguente procedura:
  1. Su un server, avviare SQL Server Management Studio e quindi connettersi all'istanza di SQL Server da cui è stato spostato il database.
  2. Aprire una nuova finestra dell'Editor di Query e quindi eseguire lo script seguente.
    USE masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal    @binvalue varbinary(256),    @hexvalue varchar (514) OUTPUTASDECLARE @charvalue varchar (514)DECLARE @i intDECLARE @length intDECLARE @hexstring char(16)SELECT @charvalue = '0x'SELECT @i = 1SELECT @length = DATALENGTH (@binvalue)SELECT @hexstring = '0123456789ABCDEF'WHILE (@i <= @length)BEGIN  DECLARE @tempint int  DECLARE @firstint int  DECLARE @secondint int  SELECT @tempint = CONVERT(int, SUBSTRING(@binvalue,@i,1))  SELECT @firstint = FLOOR(@tempint/16)  SELECT @secondint = @tempint - (@firstint*16)  SELECT @charvalue = @charvalue +    SUBSTRING(@hexstring, @firstint+1, 1) +    SUBSTRING(@hexstring, @secondint+1, 1)  SELECT @i = @i + 1ENDSELECT @hexvalue = @charvalueGO IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revloginGOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name sysnameDECLARE @type varchar (1)DECLARE @hasaccess intDECLARE @denylogin intDECLARE @is_disabled intDECLARE @PWD_varbinary  varbinary (256)DECLARE @PWD_string  varchar (514)DECLARE @SID_varbinary varbinary (85)DECLARE @SID_string varchar (514)DECLARE @tmpstr  varchar (1024)DECLARE @is_policy_checked varchar (3)DECLARE @is_expiration_checked varchar (3)DECLARE @defaultdb sysname IF (@login_name IS NULL)  DECLARE login_curs CURSOR FOR      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name <> 'sa'ELSE  DECLARE login_curs CURSOR FOR      SELECT p.sid, p.name, p.type, p.is_disabled, p.default_database_name, l.hasaccess, l.denylogin FROM sys.server_principals p LEFT JOIN sys.syslogins l      ON ( l.name = p.name ) WHERE p.type IN ( 'S', 'G', 'U' ) AND p.name = @login_nameOPEN login_cursFETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denyloginIF (@@fetch_status = -1)BEGIN  PRINT 'No login(s) found.'  CLOSE login_curs  DEALLOCATE login_curs  RETURN -1ENDSET @tmpstr = '/* sp_help_revlogin script 'PRINT @tmpstrSET @tmpstr = '** Generated ' + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'PRINT @tmpstrPRINT ''WHILE (@@fetch_status <> -1)BEGIN  IF (@@fetch_status <> -2)  BEGIN    PRINT ''    SET @tmpstr = '-- Login: ' + @name    PRINT @tmpstr    IF (@type IN ( 'G', 'U'))    BEGIN -- NT authenticated account/group      SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' FROM WINDOWS WITH DEFAULT_DATABASE = [' + @defaultdb + ']'    END    ELSE BEGIN -- SQL Server authentication        -- obtain password and sid            SET @PWD_varbinary = CAST( LOGINPROPERTY( @name, 'PasswordHash' ) AS varbinary (256) )        EXEC sp_hexadecimal @PWD_varbinary, @PWD_string OUT        EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT         -- obtain password policy state        SELECT @is_policy_checked = CASE is_policy_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name        SELECT @is_expiration_checked = CASE is_expiration_checked WHEN 1 THEN 'ON' WHEN 0 THEN 'OFF' ELSE NULL END FROM sys.sql_logins WHERE name = @name             SET @tmpstr = 'CREATE LOGIN ' + QUOTENAME( @name ) + ' WITH PASSWORD = ' + @PWD_string + ' HASHED, SID = ' + @SID_string + ', DEFAULT_DATABASE = [' + @defaultdb + ']'        IF ( @is_policy_checked IS NOT NULL )        BEGIN          SET @tmpstr = @tmpstr + ', CHECK_POLICY = ' + @is_policy_checked        END        IF ( @is_expiration_checked IS NOT NULL )        BEGIN          SET @tmpstr = @tmpstr + ', CHECK_EXPIRATION = ' + @is_expiration_checked        END    END    IF (@denylogin = 1)    BEGIN -- login is denied access      SET @tmpstr = @tmpstr + '; DENY CONNECT SQL TO ' + QUOTENAME( @name )    END    ELSE IF (@hasaccess = 0)    BEGIN -- login exists but does not have access      SET @tmpstr = @tmpstr + '; REVOKE CONNECT SQL TO ' + QUOTENAME( @name )    END    IF (@is_disabled = 1)    BEGIN -- login is disabled      SET @tmpstr = @tmpstr + '; ALTER LOGIN ' + QUOTENAME( @name ) + ' DISABLE'    END    PRINT @tmpstr  END  FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @type, @is_disabled, @defaultdb, @hasaccess, @denylogin   ENDCLOSE login_cursDEALLOCATE login_cursRETURN 0GO


    NotaQuesto script crea due stored procedure nel database master . Le procedure sono denominate sp_hexadecimal e sp_help_revlogin.
  3. Eseguire la seguente istruzione:
    EXEC sp_help_revlogin
    Lo script di output che genera la routine sp_help_revlogin archiviato è lo script di accesso. Questo script di accesso consente di creare gli account di accesso con l'identificatore di protezione (SID) originale e la password originale.
  4. Nel server B, avviare SQL Server Management Studio e connettersi all'istanza di SQL Server in cui è spostato il database.

    Importante Prima di passare al passaggio 5, esaminare le informazioni nella sezione "Osservazioni".
  5. Aprire una nuova finestra dell'Editor di Query e quindi eseguire lo script di output generato nel passaggio 3.

Note

Esaminare le informazioni seguenti prima di eseguire lo script di output nell'istanza del server b:
  • Se si tenta di creare un nuovo account di accesso SQL Server 2012 utilizzando un account di accesso 2000 di pre-SQL Server inserita nello script, è possibile che venga visualizzato il seguente errore:
    MSG 15021, livello 16, stato 2, riga 1
    Valore specificato per il parametro PASSWORD non valido. Specificare un valore di parametro valido.
    Nota Questo errore può essere visualizzato nel 2012 SQL Server a causa l'hash della password a 16 byte che vengono fornita le istruzioni CREATE LOGIN e ALTER LOGIN.

    Per risolvere il problema su un server che esegue SQL Server 2012, creare un account di accesso con una password vuota. Per effettuare questa operazione, eseguire lo script seguente:
    CREATE LOGIN [Test] WITH PASSWORD = '', SID = 0x90FD605DCEFAE14FAB4D5EB0BBA1AECC, DEFAULT_DATABASE = [master], CHECK_POLICY = ON, CHECK_EXPIRATION = OFF

    Dopo aver creato l'account di accesso con una password vuota, l'utente può modificare la password al successivo tentativo di accesso.
  • Una password può essere generato un hash in tre modi:
    • VERSION_LEGACY: questo hash è un hash di 2000 pre-SQL Server a 16 byte.
    • VERSION_SHA1: questo hash viene generato utilizzando l'algoritmo SHA1 e utilizzato in SQL Server 2000 attraverso SQL Server 2008 R2.
    • VERSION_SHA2: questo hash viene generato utilizzando l'algoritmo SHA1 512 e viene utilizzato in SQL Server 2012.
  • In SQL Server 2008 R1 e nelle versioni precedenti, gli hash delle password di pre-SQL Server 2000 erano supportati. Quando un utente è connesso utilizzando una password che viene utilizzato un hash di pre-SQL Server 2000, l'hash è stato aggiornato per utilizzare l'hash SHA1 della password.
  • Se un utente che dispone di una password che utilizza l'hash di pre-SQL Server 2000 presente su un server che esegue SQL Server 2008 R2, ciò significa che l'utente ha non connesso al server.
  • Esaminare attentamente lo script di output. Se il server a e b si trovano in domini diversi, è necessario modificare lo script di output. Quindi, è necessario sostituire il nome di dominio originale utilizzando il nuovo nome di dominio nelle istruzioni CREATE LOGIN. Gli account di accesso integrato che è consentito l'accesso nel nuovo dominio non è necessario lo stesso SID degli account di accesso del dominio originale. Pertanto, gli utenti vengono isolati da questi account di accesso. Per ulteriori informazioni su come risolvere questi utenti isolati, fare clic sul numero dell'articolo riportato di seguito per visualizzare l'articolo della Microsoft Knowledge Base:
    240872Come risolvere i problemi di autorizzazione quando si sposta un database tra server che eseguono SQL Server
    Se il server a e b sono nello stesso dominio, viene utilizzato lo stesso SID. Gli utenti sono pertanto improbabili isolate.
  • Nello script di output vengono creati gli account di accesso utilizzando la password crittografata. Ciò è dovuto l'argomento HASHED nell'istruzione CREATE LOGIN. Questo argomento specifica che la password inserita dopo l'argomento PASSWORD già viene eseguito l'hashing.
  • Per impostazione predefinita, solo un membro del ruolo predefinito del server sysadmin può eseguire un'istruzione SELECT dalla vista sys.server_principals . A meno che non fissa di membri di sysadmin il ruolo server concede le autorizzazioni necessarie per gli utenti, gli utenti non possono creare o eseguire lo script di output.
  • La procedura descritta in questo articolo non trasferisce le informazioni del database predefinito per un account di accesso. Infatti, il database predefinito potrebbe non essere presente sul server B. Per definire il database predefinito per un account di accesso, utilizzare l'istruzione ALTER LOGIN passando il nome di accesso e il database predefinito come argomenti.
  • Distinzione server a e distinzione B: l'ordine dei server a potrebbe essere distinzione e l'ordinamento del server b può essere maiuscole e minuscole. In questo caso, gli utenti devono digitare la password in lettere maiuscole dopo il trasferimento degli account di accesso e le password per l'istanza nel server B.

    A di server tra maiuscole e minuscole e distinzione B: l'ordine dei server a potrebbe essere maiuscole e minuscole e l'ordinamento del server b può essere maiuscole e minuscole. In questo caso, gli utenti non possono accedere utilizzando l'account di accesso e le password da trasferire all'istanza nel server B, a meno che non è vera una delle seguenti condizioni:
    • La password originale non contenere alcuna lettera.
    • Tutte le lettere nelle password originali sono lettere maiuscole.
    Maiuscole o su entrambi i server: l'ordine dei server a e b del server può essere maiuscole e minuscole o l'ordine dei server a e b del server può essere maiuscole e minuscole. In questi casi, gli utenti non si verificano un problema.
  • Un account di accesso è già nell'istanza del server b può avere un nome che è lo stesso nome nello script di output. In questo caso, viene visualizzato il seguente messaggio di errore quando si esegue lo script di output nell'istanza del server b:
    MSG 15025, livello 16, stato 1, riga 1
    L'entità server 'MyLogin' esiste già.
    Analogamente, un account di accesso è già nell'istanza del server b potrebbe essere un SID che corrisponde al SID nello script di output. In questo caso, viene visualizzato il seguente messaggio di errore quando si esegue lo script di output nell'istanza del server b:
    MSG 15433, livello 16, stato 1, riga 1
    Parametro fornito sid è in uso.
    Pertanto, è necessario effettuare le seguenti operazioni:
    1. Esaminare attentamente lo script di output.
    2. Esaminare il contenuto della vista sys.server_principals nell'istanza del server B.
    3. Risolvere questi messaggi di errore come appropriato.
  • In SQL Server 2005, il SID per un account di accesso viene utilizzato per implementare l'accesso a livello di database. Un account di accesso potrebbe essere SID differenti in diversi database su un server. In questo caso, l'account di accesso solo il database che contiene il SID che corrisponde al SID nella vista sys.server_principals . Questo problema può verificarsi se i due database vengono combinati da server diversi. Per risolvere questo problema, rimuovere manualmente l'account di accesso dal database che dispone di una mancata corrispondenza di SID utilizzando l'istruzione DROP USER. Quindi aggiungere nuovamente l'accesso utilizzando l'istruzione CREATE USER.
Riferimenti
Per ulteriori informazioni sulla risoluzione dei problemi degli utenti isolati, visitare il Risolvere utenti isolati Sito Web Microsoft Developer Network (MSDN).

Per ulteriori informazioni sull'istruzione CREATE LOGIN, visitare il CREARE account di accesso (Transact-SQL) Sito Web MSDN.

Per ulteriori informazioni sull'istruzione ALTER LOGIN, visitare il ALTER LOGIN (Transact-SQL) Sito Web MSDN.

Avviso: questo articolo è stato tradotto automaticamente

Proprietà

ID articolo: 918992 - Ultima revisione: 07/16/2013 02:06:00 - Revisione: 1.1

Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Workgroup Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2008 Standard, Microsoft SQL Server 2008 Workgroup, Microsoft SQL Server 2008 Developer, Microsoft SQL Server 2008 Enterprise, Microsoft SQL Server 2012 Standard, Microsoft SQL Server 2012 Developer, Microsoft SQL Server 2012 Enterprise

  • kbsqlsetup kbexpertiseadvanced kbhowto kbinfo kbmt KB918992 KbMtit
Feedback