• 検索結果がありません。

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

STEP 5. オブジェクト権限と