SQL Server のインスタンス間でログインおよびパスワードを転送する方法

文書翻訳 文書翻訳
文書番号: 246133 - 対象製品
この記事は、以前は次の ID で公開されていました: JP246133
すべて展開する | すべて折りたたむ

目次

概要

データベースを新しいサーバーに移動した後、ユーザーがその新しいサーバーにログインできなくなる場合があります。その場合、次のエラー メッセージが表示されます。
メッセージ 18456、レベル 16、状態 1
ユーザー '%ls' はログインできませんでした。
このログインおよびパスワードを新しいサーバーに転送する必要があります。この資料では、ログインおよびパスワードを新しいサーバーに転送する方法について説明します。

SQL Server 7.0 を実行しているサーバー間でログインおよびパスワードを転送する方法

SQL Server 7.0 データ変換サービス (DTS) のオブジェクト転送機能を使用すると、2 つのサーバー間でログインおよびユーザーを転送できますが、SQL Server 認証済みログインのパスワードは転送できません。SQL Server 7.0 を実行しているサーバー間でログインおよびパスワードを転送するには、「SQL Server の異なるバージョン間でログインおよびパスワードを転送する方法」に記載されている手順を実行します。

SQL Server 7.0 から SQL Server 2000 に、または SQL Server 2000 を実行しているサーバー間でログインおよびパスワードを転送する方法

SQL Server 7.0 サーバーから SQL Server 2000 のインスタンスに、または SQL Server 2000 の 2 つのインスタンス間でログインおよびパスワードを転送するには、SQL Server 2000 の DTS パッケージで新しく導入された、ログイン転送タスクを使用します。この操作を行うには、次の手順を実行します。
  1. SQL Server Enterprise Manager で、転送先の SQL Server 2000 サーバーに接続し、[データ変換サービス] に移動して、そのフォルダを展開します。次に、[ローカル パッケージ] を右クリックし、[新規パッケージ] をクリックします。
  2. DTS パッケージ デザイナが起動したら、[タスク] メニューの [ログイン転送タスク] をクリックします。[移行元] タブ、[移行先] タブ、および [ログイン] タブで、必要な情報を設定します。

    重要 : SQL Server 2000 の 64 ビット バージョンを実行しているサーバーを、転送先の SQL Server 2000 サーバーにすることはできません。これは、SQL Server 2000 の 64 ビット バージョンで使用できる DTS コンポーネントが提供されていないためです。別のコンピュータ上で実行している SQL Server のインスタンスからログインをインポートする場合、そのタスクを完了するには SQL Server インスタンスをドメイン アカウントで実行する必要があります。

    : DTS を使用するとパスワードは転送されますが、元の SID は転送されません。ログインの作成に元の SID を使用せず、ユーザー データベースも新しいサーバーに転送した場合、データベース ユーザーに対応するログインが存在しなくなります。元の SID を転送して、対応するログインの存在しないユーザー (孤立ユーザー) が発生しないようにするには、「SQL Server の異なるバージョン間でログインおよびパスワードを転送する方法」に記載されている手順を実行します。

SQL Server 2005 のインスタンス間でログインおよびパスワードを転送する方法

SQL Server 2005 のインスタンス間でログインおよびパスワードを転送する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
918992 SQL Server 2005 のインスタンス間でログインおよびパスワードを転送する方法

SQL Server の異なるバージョン間でログインおよびパスワードを転送する方法

この方法は、次の場合に使用できます。
  • SQL Server 7.0 から SQL Server 7.0 にログインおよびパスワードを転送する場合
  • SQL Server 7.0 から SQL Server 2000 にログインおよびパスワードを転送する場合
  • SQL Server 7.0 から SQL Server 2005 にログインおよびパスワードを転送する場合
  • SQL Server 2000 を実行しているサーバー間でログインおよびパスワードを転送する場合
  • SQL Server 2000 から SQL Server 2005 にログインおよびパスワードを転送する場合
: この資料の最後の「解説」に、次の手順に関する重要な情報が記載されていますので、目を通しておいてください。

SQL Server の異なるバージョン間でログインおよびパスワードを転送するには、次の手順を実行します。
  1. 転送元の SQL Server で、次のスクリプトを実行します。このスクリプトにより、master データベースに sp_hexadecimal と sp_help_revlogin という 2 つのストアド プロシージャが作成されます。このプロシージャの作成後、手順 2. に進みます。

    : 次のプロシージャは SQL Server のシステム テーブルに依存しています。システム テーブルの構造は SQL Server のバージョン間で異なる場合があるため、システム テーブルのデータを直接選択することは推奨しません。
    ----- 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. sp_help_revlogin ストアド プロシージャを作成した後、転送元サーバーのクエリ アナライザで sp_help_revlogin プロシージャを実行します。sp_help_revlogin ストアド プロシージャは、SQL Server 7.0 および SQL Server 2000 の両方で使用できます。sp_help_revlogin ストアド プロシージャの出力は、元のログインと同じ SID およびパスワードを持つログインを作成するログイン スクリプトです。この出力を保存し、転送先 SQL Server でクエリ アナライザに貼り付けて実行します。次に例を示します。
    EXEC master..sp_help_revlogin
    

解説

  • 出力されたスクリプトを転送先 SQL Server で実行する前に、そのスクリプトの内容を十分に確認してください。転送元の SQL Server インスタンスとは異なるドメインの SQL Server インスタンスにログインを転送する場合は、sp_help_revlogin プロシージャによって生成されたスクリプトを編集し、sp_grantlogin ステートメントのドメイン名を転送先のドメイン名に置き換えます。新しいドメインでアクセス権を与えられる統合ログインには、元のドメインのログインが持つ SID とは異なる SID が割り当てられるため、データベース ユーザーに対応する統合ログインが存在しなくなります。これらの孤立ユーザーの問題を解決するには、以下に記載されている資料を参照してください。同じドメインの SQL Server インスタンス間で統合ログインを転送する場合は、同じ SID が使用されるため、ユーザーが孤立状態になる可能性は低くなります。
  • ログインを移動すると、同様に移動されたデータベースに対してユーザーが持っていた権限が失われる場合があります。この問題は、"孤立ユーザー" と呼ばれています。移動されたデータベースへの権限をログインに与えようとすると、そのユーザーが既に存在することを示す次のエラー メッセージが表示される場合があります。
    Microsoft SQL-DMO (ODBC SQLState: 42000)
    エラー 15023:ユーザーまたはロール '%s' は現在のデータベースに既に存在します。
    データベース ユーザーにログインをマップして、孤立状態の SQL Server ログインおよび統合ログインを解決する方法については、次の「サポート技術情報」 (Microsoft Knowledge Base) の資料を参照してください。
    240872 [HOWTO] SQL Server を実行しているサーバー間でデータベースを移動するときに、権限の問題を解決する方法
    sp_change_users_login ストアド プロシージャを使用して、孤立ユーザーを 1 人ずつ解決する方法については、次の「サポート技術情報」 (Microsoft Knowledge Base) の資料を参照してください (この方法で解決できるのは、標準の SQL ログインから孤立したユーザーのみです)。
    274188 [SQL]PRB: 対応するログインの存在しないユーザー
  • SQL Server を実行している新しいサーバーにデータベースを移動する作業の一環として、ログインおよびパスワードの転送を行う場合は、次の「サポート技術情報」 (Microsoft Knowledge Base) の資料を参照して、関連する作業の流れや手順を確認してください。
    314546 SQL Server を実行しているコンピュータ間でデータベースを移動する方法
  • 上記のスクリプトでは、sp_addlogin システム ストアド プロシージャの @encryptopt パラメータを使用しています。このパラメータを使用すると、暗号化されたパスワードを使用してログインを作成できます。このプロシージャの詳細については、SQL Server Books Online の「sp_addlogin (Transact-SQL)」を参照してください。
  • デフォルトでは、sysadminfixed サーバー ロールのメンバのみが sysxlogins テーブルからデータを選択できます。sysadmin ロールのメンバが必要な権限を与えない限り、エンド ユーザーはこれらのストアド プロシージャを作成することも実行することもできません。
  • この方法では、特定のログインのデフォルトのデータベースに関する情報は転送されません。これは、転送先サーバーにデフォルトのデータベースが存在しない場合があるためです。ログインのデフォルトのデータベースを定義するには、sp_defaultdb システム ストアド プロシージャを使用し、ログイン名およびデフォルトのデータベースを引数として渡します。このプロシージャの詳細については、SQL Server Books Online の「sp_defaultdb (Transact-SQL)」を参照してください。
  • SQL Server のインスタンス間でログインを転送するときに、転送元サーバーの並べ替え順で大文字小文字が区別されず、転送先サーバーの並べ替え順で大文字小文字が区別される場合、転送先サーバーにログインを転送した後に、パスワードの英字をすべて大文字で入力する必要があります。転送元サーバーの並べ替え順で大文字小文字が区別され、転送先サーバーの並べ替え順で大文字小文字が区別されない場合、この資料で説明した手順で転送したログインを使用してログインすることはできません (元のパスワードに英字が含まれていない場合や、元のパスワードの英字がすべて大文字である場合は除きます)。両方のサーバーで大文字小文字が区別される場合、または区別されない場合、この問題は発生しません。この問題の原因は、SQL Server によるパスワードの処理方法です。詳細については、SQL Server 7.0 Books Online の「並べ替え順の変更によるパスワードへの影響」を参照してください。
  • 転送先サーバーで sp_help_revlogin スクリプトの出力を実行する際、スクリプトの出力に含まれているいずれかのログインと同じ名前で定義されたログインが既に転送先サーバーに存在する場合、sp_help_revlogin スクリプトの出力を実行したときに次のエラー メッセージが表示される場合があります。
    サーバー : メッセージ 15025、レベル 16、状態 1、プロシージャ sp_addlogin、行 56
    ログイン 'test1' は既に存在します。
    同様に、追加するログインと同じ SID の値を持つ他のログインが転送先サーバーに存在する場合、次のエラー メッセージが表示されます。
    サーバー : メッセージ 15433、レベル 16、状態 1、プロシージャ sp_addlogin、行 93
    指定されたパラメータ @sid は使用中です。
    このため、これらのコマンドの出力を注意深く確認し、sysxlogins テーブルの内容を調べて、適宜これらのエラーに対処する必要があります。
  • SQL Server では、特定のログインの SID の値がデータベース レベルのアクセスを実装するための基準として使用されます。そのため、1 つのログインがデータベース レベルで (そのサーバー上の 2 つの異なるデータベースで) 2 つの異なる SID の値を持っている場合、そのログインでアクセスできるデータベースは、syslogins テーブルに格納されているそのログインの SID と一致する SID を持つデータベースのみです。このような状況は、2 つの異なるサーバー上にある 2 つのデータベースを統合した場合に発生する可能性があります。この問題を解決するには、sp_dropuser ストアド プロシージャを使用して、SID が一致しないデータベースから問題のログインを手動で削除し、sp_adduser ストアド プロシージャを使用してそのログインを再度追加する必要があります。

プロパティ

文書番号: 246133 - 最終更新日: 2011年5月14日 - リビジョン: 7.0
この資料は以下の製品について記述したものです。
  • Microsoft SQL Server 7.0 Standard Edition
  • Microsoft SQL Server 2000 Personal Edition
  • Microsoft SQL Server 2000 Standard Edition
  • Microsoft SQL Server 2000 Workgroup Edition
  • Microsoft SQL Server 2000 Developer Edition
  • Microsoft SQL Server 2000 Enterprise Edition
  • Microsoft SQL Server 2005 Standard Edition
  • Microsoft SQL Server 2005 Workgroup Edition
  • Microsoft SQL Server 2005 Developer Edition
  • Microsoft SQL Server 2005 Enterprise Edition
キーワード:?
kbsqlmanagementtools kbhowtomaster kbinfo KB246133
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com