DetailPage-MSS-KB

Knowledge Base

Artikel-ID: 246133 - Geändert am: Dienstag, 15. Februar 2011 - Version: 6.2

Dieser Artikel wurde zuvor veröffentlicht unter D246133
Dieser Artikel ist eine Übersetzung des folgenden englischsprachigen Artikels der Microsoft Knowledge Base:
246133  (http://support.microsoft.com/kb/246133/EN-US/ ) How to transfer logins and passwords between instances of SQL Server
Bitte beachten Sie: Bei diesem Artikel handelt es sich um eine Übersetzung aus dem Englischen. Es ist möglich, dass nachträgliche Änderungen bzw. Ergänzungen im englischen Originalartikel in dieser Übersetzung nicht berücksichtigt sind. Die in diesem Artikel enthaltenen Informationen basieren auf der/den englischsprachigen Produktversion(en). Die Richtigkeit dieser Informationen in Zusammenhang mit anderssprachigen Produktversionen wurde im Rahmen dieser Übersetzung nicht getestet. Microsoft stellt diese Informationen ohne Gewähr für Richtigkeit bzw. Funktionalität zur Verfügung und übernimmt auch keine Gewährleistung bezüglich der Vollständigkeit oder Richtigkeit der Übersetzung.

Auf dieser Seite

Zusammenfassung

Nachdem Sie Datenbanken auf einen neuen Server verschoben haben, können sich die Benutzer unter Umständen nicht auf dem neuen Server anmelden. Stattdessen wird folgende Fehlermeldung angezeigt:
Meldung 18456, Ebene 16, Status 1
Anmeldung für Benutzer '%ls' fehlgeschlagen.
Sie müssen die Benutzernamen und Kennwörter auf den neuen Server übertragen. Dieser Artikel beschreibt, wie Sie Benutzernamen und Kennwörter auf einen neuen Server übertragen.

Übertragen von Benutzernamen und Kennwörtern zwischen Servern, auf denen SQL Server 7.0 ausgeführt wird

Mithilfe der Funktion Objektübertragung der Data Transformation Services (DTS) in SQL Server 7.0 können Benutzernamen und Benutzer zwischen zwei Servern übertragen werden. Die Kennwörter für SQL Server-authentifizierte Anmeldungen werden dabei jedoch nicht übertragen. Gehen Sie nach der Anleitung im Abschnitt "Komplettlösung zum Übertragen von Benutzernamen und Kennwörtern zwischen verschiedenen Versionen von SQL-Server" dieses Artikels vor, um Benutzernamen und Kennwörter von einem SQL Server 7.0-basierten Server auf einen anderen SQL Server 7.0-basierten Server zu übertragen.

Übertragen von Benutzernamen und Kennwörtern von SQL Server 7.0 auf SQL Server 2000 oder zwischen Servern, auf denen SQL Server 2000 ausgeführt wird

Zum Übertragen von Benutzernamen und Kennwörtern von einem SQL Server 7.0-Server auf eine Instanz eines SQL Server 2000-Servers oder zwischen zwei SQL Server 2000-Instanzen können Sie den neuen Task "Benutzernamen übertragen" des DTS-Pakets von SQL Server 2000 verwenden. Gehen Sie hierzu folgendermaßen vor:
  1. Stellen Sie die Verbindung zu dem SQL Server 2000-Zielserver her, gehen Sie zu den Data Transformation Services im SQL Server Enterprise Manager, erweitern Sie den Ordner, klicken Sie mit der rechten Maustaste auf Lokale Pakete, und klicken Sie auf Neues Paket.
  2. Nachdem der DTS-Paketdesigner geöffnet wurde, klicken Sie im Menü Task auf Task "Benutzernamen übertragen". Geben Sie die entsprechenden Informationen auf den Registerkarten Quelle, Ziel und Benutzernamen ein.

    Wichtig: Der SQL Server 2000-Zielserver darf nicht die 64-Bit-Version von SQL Server 2000 verwenden. Die DTS-Komponenten für die 64-Bit-Version von SQL Server 2000 sind nicht verfügbar. Wenn Sie Benutzernamen aus einer SQL Server-Instanz importieren, die sich auf einem separaten Computer befindet, muss Ihre SQL Server-Instanz unter einem Domänenkonto laufen, um den Task ausführen zu können.

    Hinweis: Die DTS-Methode überträgt die Kennwörter, aber nicht die ursprünglichen SIDs. Wird ein Login nicht mit der ursprünglichen SID erstellt und werden Benutzerdatenbanken ebenfalls auf einen neuen Server transferiert, so verwaisen die Datenbankbenutzer in Bezug auf den Login. Folgen Sie den Schritten im Abschnitt "Komplettlösung zum Übertragen von Benutzernamen und Kennwörtern zwischen verschiedenen Versionen von SQL-Server " dieses Artikels, um die ursprüngliche SID zu übertragen und das Problem der verwaisten Benutzer zu umgehen.

2005

Weitere Informationen zum finden Sie im folgenden Artikel der Microsoft Knowledge Base:
918992  (http://support.microsoft.com/kb/918992/DE/ ) Wie Übertragen der Benutzername und der Kennworte zwischen alle Instanzen von SQL Server 2005

Komplettlösung zum Übertragen von Benutzernamen und Kennwörtern zwischen verschiedenen Versionen von SQL-Server

Diese Methode bezieht sich auf folgende Szenarien:
  • Sie übertragen Benutzernamen und Kennwörter von SQL Server 7.0 auf SQL Server 7.0.
  • Sie übertragen Benutzernamen und Kennwörter von SQL Server 7.0 auf SQL Server 2000.
  • Sie übertragen Benutzernamen und Kennwörter von SQL Server 7.0 auf SQL Server 2005.
  • Sie übertragen Benutzernamen und Kennwörter zwischen Servern, auf denen SQL Server 2000 ausgeführt wird.
  • Sie übertragen Benutzernamen und Kennwörter von SQL Server 2000 auf SQL Server 2005.
Hinweis: Wichtige Informationen bezüglich der folgenden Schritte entnehmen Sie den Anmerkungen am Ende dieses Artikels.

Führen Sie folgende Schritte aus, um Benutzernamen und Kennwörter zwischen verschiedenen Versionen von SQL Server zu übertragen:
  1. Führen Sie das folgende Skript auf dem SQL-Quellserver aus. Dieses Skript erstellt zwei gespeicherte Prozeduren mit den Namen sp_hexadecimal und sp_help_revlogin in Ihrer master-Datenbank. Fahren Sie mit Schritt 2 fort, wenn Sie die Prozedur erstellt haben.

    Hinweis: Die folgende Prozedur ist von SQL Server-Systemtabellen abhängig. Die Struktur dieser Tabellen kann in unterschiedlichen Versionen von SQL Server abweichen. Von einer direkten Auswahl aus den Systemtabellen wird abgeraten.
    ----- Begin Script, Create sp_help_revlogin procedure -----
    
    USE master
    GO
    IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL
      DROP PROCEDURE sp_hexadecimal
    GO
    CREATE PROCEDURE sp_hexadecimal
        @binvalue varbinary(256),
        @hexvalue varchar(256) OUTPUT
    AS
    DECLARE @charvalue varchar(256)
    DECLARE @i int
    DECLARE @length int
    DECLARE @hexstring char(16)
    SELECT @charvalue = '0x'
    SELECT @i = 1
    SELECT @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 + 1
    END
    SELECT @hexvalue = @charvalue
    GO
    
    IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL
      DROP PROCEDURE sp_help_revlogin 
    GO
    CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS
    DECLARE @name    sysname
    DECLARE @xstatus int
    DECLARE @binpwd  varbinary (256)
    DECLARE @txtpwd  sysname
    DECLARE @tmpstr  varchar (256)
    DECLARE @SID_varbinary varbinary(85)
    DECLARE @SID_string varchar(256)
    
    IF (@login_name IS NULL)
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name <> 'sa'
    ELSE
      DECLARE login_curs CURSOR FOR 
        SELECT sid, name, xstatus, password FROM master..sysxlogins 
        WHERE srvid IS NULL AND name = @login_name
    OPEN login_curs 
    FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
    IF (@@fetch_status = -1)
    BEGIN
      PRINT 'No login(s) found.'
      CLOSE login_curs 
      DEALLOCATE login_curs 
      RETURN -1
    END
    SET @tmpstr = '/* sp_help_revlogin script ' 
    PRINT @tmpstr
    SET @tmpstr = '** Generated ' 
      + CONVERT (varchar, GETDATE()) + ' on ' + @@SERVERNAME + ' */'
    PRINT @tmpstr
    PRINT ''
    PRINT 'DECLARE @pwd sysname'
    WHILE (@@fetch_status <> -1)
    BEGIN
      IF (@@fetch_status <> -2)
      BEGIN
        PRINT ''
        SET @tmpstr = '-- Login: ' + @name
        PRINT @tmpstr 
        IF (@xstatus & 4) = 4
        BEGIN -- NT authenticated account/group
          IF (@xstatus & 1) = 1
          BEGIN -- NT login is denied access
            SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''
            PRINT @tmpstr 
          END
          ELSE BEGIN -- NT login has access
            SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''
            PRINT @tmpstr 
          END
        END
        ELSE BEGIN -- SQL Server authentication
          IF (@binpwd IS NOT NULL)
          BEGIN -- Non-null password
            EXEC sp_hexadecimal @binpwd, @txtpwd OUT
            IF (@xstatus & 2048) = 2048
              SET @tmpstr = 'SET @pwd = CONVERT (varchar(256), ' + @txtpwd + ')'
            ELSE
              SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256), ' + @txtpwd + ')'
            PRINT @tmpstr
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', @pwd, @sid = ' + @SID_string + ', @encryptopt = '
          END
          ELSE BEGIN 
            -- Null password
    	EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT
            SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name 
              + ''', NULL, @sid = ' + @SID_string + ', @encryptopt = '
          END
          IF (@xstatus & 2048) = 2048
            -- login upgraded from 6.5
            SET @tmpstr = @tmpstr + '''skip_encryption_old''' 
          ELSE 
            SET @tmpstr = @tmpstr + '''skip_encryption'''
          PRINT @tmpstr 
        END
      END
      FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwd
      END
    CLOSE login_curs 
    DEALLOCATE login_curs 
    RETURN 0
    GO
     ----- End Script -----
    
    
  2. Nachdem Sie die Prozedur sp_help_revlogin erstellt haben, führen Sie sie mit dem Query Analyzer auf dem Quellserver aus. Die gespeicherte Prozedur sp_help_revlogin kann sowohl bei SQL Server 7.0 als auch bei SQL Server 2000 eingesetzt werden. Die Prozedur gibt Anmeldeskripte aus, die Benutzernamen mit der ursprünglichen SID und dem ursprünglichen Kennwort erzeugen. Speichern Sie die Ausgabe, kopieren Sie sie in den Query Analyzer auf dem SQL-Zielserver, und führen Sie sie aus. Beispiel:
    EXEC master..sp_help_revlogin
    

Anmerkungen

  • Überprüfen Sie das Ausgabeskript sorgfältig, bevor Sie es auf dem SQL-Zielserver ausführen. Wenn Sie Benutzernamen auf eine SQL-Server-Instanz übertragen müssen, die sich in einer anderen Domäne als die SQL-Server-Quellinstanz befindet, bearbeiten Sie das mithilfe der Prozedur sp_help_revlogin erzeugte Skript, und ersetzen Sie den Domänennamen durch den neuen Domänennamen in den Anweisungen sp_grantlogin. Da die integrierten Benutzernamen mit Zugriff in der neuen Domäne nicht dieselbe SID wie die Benutzernamen in der Originaldomäne haben, verwaisen die Datenbankbenutzer dieser Benutzernamen. Weitere Informationen zum Lösen des Problems der verwaisten Benutzer finden Sie in den nachfolgend aufgeführten Artikeln. Wenn Sie integrierte Benutzernamen zwischen SQL Server-Instanzen in derselben Domäne übertragen, wird dieselbe SID verwendet, sodass der Benutzer kaum verwaisen kann.
  • Nachdem Sie die Benutzernamen verschoben haben, fehlen Benutzern möglicherweise Berechtigungen für Datenbanken, die auch verschoben wurden. Dieses Problem wird als "verwaister Benutzer" bezeichnet. Wenn Sie versuchen, die Anmeldung bei der Datenbank zu erlauben, wird womöglich nicht angezeigt, dass der Benutzer bereits existiert:
    Microsoft SQL-DMO (ODBC SQLState: 42000) Fehler 15023: Der Benutzer oder die Rolle '%s' ist in der aktuellen Datenbank bereits vorhanden.
    Eine Anleitung dazu, wie Sie die Benutzernamen den Datenbankbenutzern zuordnen können, um das Problem verwaister SQL-Server-Benutzernamen und integrierter Benutzernamen zu beheben, finden Sie im folgenden Artikel der Microsoft Knowledge Base:
    240872  (http://support.microsoft.com/kb/240872/DE/ ) Lösen von Zugriffsproblemen, wenn eine Datenbank auf einen anderen SQL-Server verschoben wird
    Eine Anleitung dazu, wie Sie die gespeicherte Prozedur sp_change_users_login einsetzen können, um verwaiste Benutzer der Reihe nach zu beheben (dies gilt nur für verwaiste Benutzer von standardmäßigen SQL-Benutzernamen) finden Sie im folgenden Artikel der Microsoft Knowledge Base:
    274188  (http://support.microsoft.com/kb/274188/DE/ ) PRB: Problemthema "Behandlung" bei verwaisten Benutzern in Online-Dokumentation befindet sich unvollständig
  • Wenn die Übertragung von Benutzernamen und Kennwörtern im Rahmen der Verschiebung von Datenbanken auf einen neuen SQL Server-basierten Server erfolgt, lesen Sie den folgenden Artikel der Microsoft Knowledge Base, um eine Beschreibung des Workflows und der einzelnen Schritte zu erhalten:
    314546  (http://support.microsoft.com/kb/314546/DE/ ) Verschieben von Datenbanken zwischen Computern mit SQL Server
  • Dieses Verfahren wird durch den Parameter @encryptopt in der gespeicherten Systemprozedur sp_addlogin ermöglicht, die das Erstellen eines Benutzernamens mithilfe des verschlüsselten Kennworts erlaubt. Weitere Informationen zu dieser Prozedur finden Sie unter dem Thema "sp_addlogin (T-SQL)" in der Onlinedokumentation zu SQL Server.
  • Standardmäßig können nur Mitglieder der festen Serverrolle sysadmin auf die Tabelle sysxlogins zugreifen. Sofern nicht ein Mitglied der sysadmin-Rolle die erforderlichen Berechtigungen erteilt, können Endbenutzer diese gespeicherten Prozeduren weder erstellen noch ausführen.
  • Bei diesem Ansatz wird nicht versucht, die Informationen der Standarddatenbank für einen bestimmten Benutzernamen zu übertragen, da die Standarddatenbank nicht unbedingt auf dem Zielserver existieren muss. Verwenden Sie die gespeicherte Systemprozedur sp_defaultdb, indem Sie den Benutzernamen und die Standarddatenbank als Argumente übergeben, um die Standarddatenbank für einen Benutzernamen festzulegen. Weitere Informationen zur Verwendung dieser Prozedur finden Sie unter dem Thema "sp_defaultdb" in der Onlinedokumentation zu SQL Server.
  • Wenn bei einer Übertragung von Benutzernamen zwischen SQL-Servern die Sortierreihenfolge des Quellservers nicht zwischen Groß- und Kleinschreibung unterscheidet, die Sortierreihenfolge des Zielservers jedoch schon, müssen Sie nach der Übertragung der Benutzernamen auf den Zielserver alle Buchstaben in Kennwörtern als Großbuchstaben eingeben. Wenn die Sortierreihenfolge des Quellservers zwischen Groß- und Kleinschreibung unterscheidet, die Sortierreihenfolge des Zielservers jedoch nicht, können Sie sich mit den Benutzernamen, die mit der in diesem Artikel beschriebenen Prozedur übertragen wurden, nicht anmelden, es sei denn, die ursprünglichen Kennwörter enthalten keine Buchstaben oder alle enthaltenen Buchstaben sind Großbuchstaben. Wenn beide Server zwischen Groß- und Kleinschreibung unterscheiden bzw. nicht unterscheiden, tritt dieses Problem nicht auf. Es handelt sich dabei um eine Nebenwirkung der Handhabung von Kennwörtern in SQL Server. Weitere Informationen hierzu finden Sie unter dem Thema "Effect on Passwords of Changing Sort Orders" in der Onlinedokumentation zu SQL Server 7.0.
  • Wenn Sie die Ausgabe des Skripts sp_help_revlogin auf dem Zielserver ausführen, und der Zielserver besitzt bereits einen Benutzernamen desselben Namens wie einer der Benutzernamen der Skriptausgabe, wird nach der Ausführung der Ausgabe des Skripts sp_help_revlogin möglicherweise die folgende Fehlermeldung angezeigt:
    Server: Meldung 15025, Ebene 16, Status 1, Prozedur sp_addlogin, Zeile 56
    Benutzername 'test1' ist bereits vorhanden.
    Entsprechend wird, wenn auf diesem Server ein anderer Benutzername mit derselben SID wie der Benutzername existiert, den Sie gerade hinzufügen möchten, die folgende Fehlermeldung angezeigt:
    Server: Meldung 15433, Ebene 16, Status 1, Prozedur sp_addlogin, Zeile 93
    Angegebener Parameter @sid wird verwendet.
    Daher müssen Sie die Ausgabe dieser Befehle sorgfältig überprüfen, den Inhalt der Tabelle sysxlogins durchgehen und entsprechend auf diese Fehler reagieren.
  • Der SID-Wert für einen bestimmten Benutzernamen wird als Basis für die Implementierung des Datenbankzugriffs in SQL Server verwendet. Daher gilt Folgendes: Wenn derselbe Benutzername zwei unterschiedliche SID-Werte auf der Datenbankebene (in zwei unterschiedlichen Datenbanken auf diesem Server) hat, kann der Benutzer nur auf die Datenbank zugreifen, deren SID mit dem Wert in der Tabelle syslogins für diesen Benutzer übereinstimmt. Eine solche Situation könnte eintreten, wenn die zwei betroffenen Datenbanken aus zwei unterschiedlichen Servern konsolidiert wurden. Der betroffene Benutzer müsste mithilfe der gespeicherten Prozedur sp_dropuser manuell aus der Datenbank mit dem SID-Konflikt entfernt und anschließend mithilfe der gespeicherten Prozedur sp_adduser erneut hinzugefügt werden, um dieses Problem zu beheben.
Keywords: 
kbsqlssis kbhowtomaster kbinfo KB246133
Microsoft stellt Ihnen die in der Knowledge Base angebotenen Artikel und Informationen als Service-Leistung zur Verfügung. Microsoft übernimmt keinerlei Gewährleistung dafür, dass die angebotenen Artikel und Informationen auch in Ihrer Einsatzumgebung die erwünschten Ergebnisse erzielen. Die Entscheidung darüber, ob und in welcher Form Sie die angebotenen Artikel und Informationen nutzen, liegt daher allein bei Ihnen. Mit Ausnahme der gesetzlichen Haftung für Vorsatz ist jede Haftung von Microsoft im Zusammenhang mit Ihrer Nutzung dieser Artikel oder Informationen ausgeschlossen.
Freigeben
Weitere Supportoptionen
Microsoft Community-Supportforen
Kontaktieren Sie uns direkt
Zertifizierten Partner finden
Microsoft Store