STEP 4. データベース ユーザー
4.3 SQL ステートメントでデータベース ユーザーの作成
Security ID)を利用して行われていることが原因で発生しています。SID は、database_principals ビューで参照する ことができます(ログイン アカウントに割り当てられた SID は、server_principals ビューで参照することができま す)。
SQL Server 認証用のログイン アカウントに割り当てられる SID は、マシンが異なると、違うものが割り当てられる
ので、開発機と本番環境(移行元と移行先)では、ログイン アカウントの SID が異なることになります。これによっ て、不明なデータベース ユーザーが発生し、このままでは、該当データベース ユーザーが利用できない状態となります
(データベースへの接続が行えません)。
■ sp_change_users_login
不明なデータベース ユーザーが存在するかどうかを確認するには、次のように sp_change_users_login システム ストアド プロシージャを利用します。
USE データベース名
EXEC sp_change_users_login 'Report'
不明なデータベース ユーザーが存在した場合に、それを解消するには、次のように sp_change_users_login システ ム ストアド プロシージャを実行します。
USE データベース名
EXEC sp_change_users_login 'Update_One', '不明なデータベースユーザー名', '新しいログインアカウント名' Update_One を指定して sp_change_users_login を実行すると、不明なデータベース ユーザーの古い SID(移行 元の SID)を新しいログイン アカウントの SID(移行先の SID)へ更新し、再マッピングをしてくれるようになりま す。これで不明なデータベース ユーザーが解消されて、移行元と同じようにデータベース ユーザーを利用できるように なります。
■ 同じパスワード/SID のログイン アカウントの作成: sp_help_revlogin
sp_change_users_login によるログイン アカウントの再マッピングは、データベース ユーザーの数が多い場合には、
大変な作業です。これを解決するには、同じパスワードで、かつ同じ SID のログイン アカウントを作成することです。
これを行うには、マイクロソフトのサポート技術情報 (KB: Knowledge Base) の文書番号 918992 で提供されている
「sp_help_revlogin」というストアド プロシージャを使用します。
KB918992: SQL Server 2005 のインスタンス間でログインおよびパスワードを転送する方法 http://support.microsoft.com/kb/918992/ja
この文書で提供されるスクリプトを丸ごとコピーし、Management Studio のクエリ エディターへ貼り付けて実行する と、sp_help_revlogin ストアド プロシージャを作成することができます(文書は SQL Server 2005 用ですが、SQL
Server 2012 でも同様に利用することができます)。作成後は、以下のように実行すれば、同一のパスワード/SID の
ログイン アカウントを作成するためのスクリプト (CREATE LOGIN ステートメント) が生成されます。
USE master
EXEC sp_help_revlogin
■ 包含データベース(Contained Database)による不明なデータベース ユーザーの解消
SQL Server 2012 からは、ログイン アカウントに依存しない(マッピングが不要な)データベース ユーザーを作成す
ることができる「包含データベース」(Contained Database)機能も提供されました(独立したデータベース ユーザー をデータベース内に含められることから Contained と名付けられています)。
包含データベースを利用するには、sp_configure を利用して、SQL Server の構成オプションで Contained Database
Authentication(包含データベース認証)を有効化(1へ設定)しておく必要があります。これは次のように実行します。
EXEC sp_configure 'contained database authentication', 1 RECONFIGURE
包含データベースへ設定するには、次のようにデータベースのプロパティを開いて、[オプション]ページから[コンテ インメントの種類]で「部分」を選択します。
ログイン アカウントに依存しないデータベース ユーザーを作成するには、次のように新しいユーザーの作成ダイアログ で、[ユーザーの種類]で「パスワードを持つユーザー」を選択します。
1
3 2
1
3 2
SQL ステートメントを利用して、包含データベース 内にデータベース ユーザーを作成する場合には、次のように CREATE USER ステートメントを実行します。
USE sampleDB2 go
CREATE USER testuser1 WITH PASSWORD = 'P@ssword'
WITH PASSWORD でパスワードを設定することで、データベースの中に包含されたデータベース ユーザーを作成する
ことができます。
作成したユーザー(testuser1 の場合)で SQL Server へ接続するには、次のように[サーバーへの接続]ダイアログ で「SQL Server 認証」を選択して、[ログイン]と[パスワード]に作成したユーザーの名前とパスワードを入力し、
[オプション]ボタンをクリックします。
[接続プロパティ]タブが表示されたら、[データベースへの接続]へ接続先となるデータベース名(画面は sampleDB2)
を入力して、[接続]ボタンをクリックします。
これで作成したユーザーでデータベースへ接続することができます。
このように 包含データベースを利用すれば、データベース ユーザーがデータベース内に包含されるので、マッピングの 切れたユーザーが発生することはありません。
包含データベースは、tempdb の照合順序に依存しない一時テーブルの作成ができることも大きなメリットです(照合 順序については、本自習書シリーズの「Transact-SQL 入門」編で説明)。従来のバージョンでは、CREATE TABLE ス テートメントを利用して作成した一時テーブルの照合順序は tempdb の照合順序を継承するため、データベース移行時 に、移行元と移行先で tempdb の照合順序が異なる場合に、照合順序の不一致が発生するという問題がありました。こ
1
2
1
2
3