ログン ゕカウントの複製
データベース ミラーリングでは、データベース内のオブジェクトは、すべてミラーへ複製するこ とができますが、システム データベースへ含まれるもの(SQL Server の環境設定オプションなど)
はミラーへ複製することはできません。あくまでもミラーを設定した該当データベース内のオブジ ェクトのみが複製されることを意識しておく必要があります。
したがって、システム データベース(master データベース)へ含まれる「ログン ゕカウント」
は、ミラーへは複製されないので、手動で複製する必要があります。
Let's Try
それでは、これを試してみましょう。
1. まずは、プリンシパル(BAMBOO)へ接続し、クエリ エデゖタからログン ゕカウント
「testLogin1」を作成して、それに対応したデータベース ユーザーを MirrorTest データ ベース内へ作成します。
-- SQL Server 認証用のログインアカウントの作成 CREATE LOGIN testLogin1
WITH PASSWORD = 'P@ssword'
-- データベースユーザーの作成 USE MirrorTest
CREATE USER testLogin1 FOR LOGIN testLogin1
2. 次に、オブジェクト エクスプローラで、作成したデータベース ユーザーを確認しておきまし ょう。
3. 続いて、プリンシパル(BAMBOO)へ接続したクエリ エデゖタから、手動フェールオーバー
2
を実行します。
USE master
ALTER DATABASE MirrorTest SET PARTNER FAILOVER
4. フェールオーバーが完了したら、新しいプリンシパル(BAMBOO\MIRROR)へ testlogin1 ログン ゕカウントを作成します(データベース ミラーリングでは、ログン ゕカウント は複製されないので手動で作成する必要があります)。
-- 新プリンシパル側(旧ミラー)側で実行 CREATE LOGIN testLogin1
WITH PASSWORD = 'P@ssword'
5. 次に、データベース ミラーリングによって、現在のプリンシパル(BAMBOO\MIRROR)
へデータベース ユーザーが複製されたことを確認します。オブジェクト エクスプローラでデ ータベースを展開します。
データベース ユーザーは複製されていますが、プロパテゖを参照すると、「ログン名」が空 になっていることを確認できます。これは、ログン ゕカウントに対応付けられていない「不 明なデータベース ユーザー」と呼ばれ、使用することができないユーザーです(testlogin1 は MirrorTest データベースへ接続することができません)。
6. 不明なデータベース ユーザーは、sp_change_users_login システム ストゕド プロシー
1
ログン名が 空になっている 2
ジャを利用してリストゕップすることができます。
USE MirrorTest
EXEC sp_change_users_login 'Report'
ログン ゕカウントとデータベース ユーザーの関連付け(マッピング)は、ログン ゕカ ウントの SID(内部的な Security ID)を利用して行われていますが、SID は、ンスタン スが異なると、違うものが割り当てられるので、プリンシパルとミラーでは異なる SID が割 り当てられてしまっています。
sp_change_users_login がリストゕップしているのは、SID の対応付けがうまくいってい ないユーザーで、そのユーザーが対応付けられている SID が出力されます。
7. CREATE LOGIN ステートメントは、SID を指定して作成することもできるので、上記の sp_change_users_login が出力した SID を指定して、ログン ゕカウントを作成するこ とが可能です。
-- 新プリンシパル側(旧ミラー:BAMBOO\MIRROR)側で実行
-- ログインを削除して、コピーした SID を張り付けて、ログイン作成 DROP LOGIN testLogin1
go
CREATE LOGIN testLogin1 WITH PASSWORD = 'P@ssword'
,SID = 0xD2FB5F4BA3BD1147925B42270ABE980F
SID は、皆さんの環境によって異なるものが割り当てられるので、sp_change_users_login で取得した SID へ置き換えて実行してください。
8. このように、プリンシパルとミラーで同じ SID のログン ゕカウントを作成した場合は、
次のように対応付けがきちんと設定されて、正しく利用できるユーザーになります。
9. sp_change_users_login システム ストゕド プロシージャを再度実行すると、不明なデータ ベース ユーザーが消えていることを確認できます。
1
Note: 新しい SID への再マッピング
手順では、sp_change_users_login で取得した SID を CREATE LOGIN ステートメントへ貼り付けて実行しま したが、SID が異なるログン ゕカウントの場合でも、次のように sp_change_users_login を実行することで 不明なデータベース ユーザーを解消することができます。
USE データベース名
EXEC sp_change_users_login 'Update_One', '不明なデータベースユーザー名', '新しいログインアカウント名' 第 1 引数へ 'Update_One' を指定することで、新しいログン ゕカウントの SID へ再マッピングすることが できます。
同じパスワード/SID のログン ゕカウントの作成: sp_help_revlogin
SID を指定した CREATE LOGIN ステートメントや、sp_change_users_login によるログン ゕカウントの再マッピングは、データベース ユーザーの数が多い場合には、大変な作業です。こ れを解決するには、同じパスワードで、かつ同じ SID のログン ゕカウントを作成することで す。これを行うには、マクロソフトのサポート技術情報 (KB: Knowledge Base) の文書番号 918992 で提供されている「sp_help_revlogin」というストゕド プロシージャを使用します。
KB 918992: SQL Server 2005 のンスタンス間でログンおよびパスワードを転送する方法 http://support.microsoft.com/kb/918992/ja
この文書で提供されるスクリプトを丸ごとコピーし、Management Studio のクエリ エデゖタへ 貼り付けて実行すると、sp_help_revlogin ストゕド プロシージャを作成することができます。
作成後は、以下のように実行すれば、同一のパスワード/SID のログン ゕカウントを作成するた めのスクリプト (CREATE LOGIN ステートメント) が生成されます。
後は、生成された CREATE LOGIN ステートメントをミラー側で実行すれば、同一のパスワード / SID のログン ゕカウントを作成できようになります(不明なユーザーを解消できます)。