現在オフラインです。再接続するためにインターネットの接続を待っています

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

この記事は、以前は次の 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 masterGOIF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimalGOCREATE PROCEDURE sp_hexadecimal    @binvalue varbinary(256),    @hexvalue varchar(256) OUTPUTASDECLARE @charvalue varchar(256)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 = @charvalueGOIF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revlogin GOCREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL ASDECLARE @name    sysnameDECLARE @xstatus intDECLARE @binpwd  varbinary (256)DECLARE @txtpwd  sysnameDECLARE @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_nameOPEN login_curs FETCH NEXT FROM login_curs INTO @SID_varbinary, @name, @xstatus, @binpwdIF (@@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 ''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  ENDCLOSE login_curs DEALLOCATE login_curs RETURN 0GO ----- 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 - 最終更新日: 05/14/2011 21:59:00 - リビジョン: 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
フィードバック