トップページへ PASSJ ブログへ
トップページへ
分科会
特集!
コミュニケーション
資格
セミナー・コンファレンス
インフォメーション
エラーでおぼえる!? SQL Server 2000 管理運用術
文=鈴木智行(NEC Eラーニング事業部)
第3回
権限があるのにアクセスできない?
OracleでもSQL Serverでも、管理作業やデータベースオブジェクトの操作をするためには、権限が必要です。しかし権限の設定方法や考え方がまったく同じわけではありません。今回はその「権限」をテーマに、Oracleを管理していた方がSQL Serverで戸惑うであろうポイントをご紹介します。

なお、「Oracleキーワードから学ぶ、逆引き! SQL Server入門」第9回では、権限管理の機能である「ロール」について解説されています。ぜひそちらもご参照ください。

目次
ステートメント権限さえあれば、データベースオブジェクトは作成可能
所有権の継承
組み合わせ所有権
〜最後に〜

ステートメント権限さえあれば、データベースオブジェクトは作成可能


SQL Server 2000でビューを作成する場合、データベースに対してcreate viewステートメント権限があればビューを作成できます。すなわちビューの作成者が元のデータベースオブジェクト(たとえばテーブル)に対してselectオブジェクト権限がなくても、ビューを作成できてしまうということです。しかし、作成されたビューを実際に利用する際は、基本的にビューにはデータが格納されていないので(インデックス付きビューなどを除く)、元のテーブルのデータにアクセスすることになります。

Oracleでは、ビューの作成者にオブジェクト権限を割り当てるときにgrant optionオプションを指定することで、依存関係をもったデータベースオブジェクトの権限を管理していきますが、SQL Server では「所有権」の継承を考慮する必要があります。

所有権とは「所有者」がもつ権利で、所有者とはデータベースオブジェクトを作成したユーザーのことです(ただし所有者は変更可能です)。通常データベースオブジェクトを指定する場合、データベースオブジェクトは所有者で修飾して指定します。

(例)  select * from 所有者名.データベースオブジェクト名.

ただし所有者名は省略できる(省略した場合は自分、もしくはdboとみなされる)ため、慣れてくるとあまり意識しない方が多いように見受けられます。



所有権の継承


依存関係を持つデータベースオブジェクトを管理する場合、所有者が重要になります。
所有権の継承は大きく分けて以下の2つがあり、データベースオブジェクトの所有者によって実際にアクセスした結果が異なります。

1. 壊れていない所有権の継承
依存関係を持つデータベースオブジェクトの所有者(データベースユーザー)が同じ場合
2. 壊れた所有権の継承
依存関係を持つデータベースオブジェクトの所有者(データベースユーザー)が異なる場合

たとえばBRISBANEにDB_Aというデータベースを用意し、下記のような状況でテーブルとビューを用意します。

ユーザー テーブルに関する状況 ビューに関する状況
UserA t_社員テーブル作成 t_社員テーブルからv1_社員ビュー作成
(壊れていない所有権の継承)
UserB - t_社員テーブルからv2_社員ビュー作成
(壊れた所有権の継承)
UserC t_社員テーブルの
select権限なし
v1_社員ビュー、v2_社員ビューの
select権限あり

クエリアナライザからBRISBANEにUserCでログインし、DB_A上のv1_社員ビューとv2_社員ビューを検索します(画面1)。

■ 画面1 UserCがv1_社員ビューとv2_社員ビューを検索
(図)UserCがv1_社員ビューとv2_社員ビューを検索

【画面1】からおわかりのとおり、UserCはUserAが作成したv1_社員ビューは検索できますが、UserBが作成したv2_社員ビューは検索できません。

すなわちSQL Server 2000は、依存関係を持つデータベースオブジェクトの所有者が同じ場合には元のオブジェクトの権限のチェックを行わず、依存関係を持つデータベースオブジェクトの所有者が異なる場合には元のオブジェクトの権限のチェックを行うということです。

管理を簡素化したい場合は、dboデータベースユーザーなどですべてのデータベースオブジェクトの所有者を統一しておくとよいでしょう。このようにしておけば、権限設定に原因がある場合、元のオブジェクトを意識せずにアクセス対象となっているデータベースオブジェクトの権限だけをチェックするだけでトラブルシューティングを簡単に行うことができます。



組み合わせ所有権


SQL Server 2000の最新のサービスパックであるSP3aでは、所有権の継承の考え方がデータベース間でも指定できます。SP3aの適用時(画面2)、あるいはSP3aの適用後には、SQL Server Enterprise Managerでコンピュータを右クリック-[プロパティ]-[セキュリティ]タブ(画面3)で、「組み合わせ所有権」を有効にするかどうかを指定することができます。この場合、所有者はデータベースユーザーでなくログインアカウントを意識します。

■ 画面2 組み合わせ所有権の指定(SQL Server 2000 SP3セットアップ時)
(図)組み合わせ所有権の指定(SQL Server 2000 SP3セットアップ時)

■ 画面3 組み合わせ所有権の指定(SQL Server 2000 SP3適用後)
(図)組み合わせ所有権の指定(SQL Server 2000 SP3適用後)

たとえば、BRISBANEにDB_AとDB_Bというデータベースを用意し、下記のような構成でテーブルとビューを用意します。

ユーザー DB テーブルに関する状況 ビューに関する状況
UserA DB_A t_社員テーブル作成
DB_B - t_社員テーブルからv1_社員ビュー作成
UserB DB_A - -
DB_B - t_社員テーブルからv2_社員ビュー作成
UserC DB_A t_社員テーブルのselect権限なし -
DB_B - v1_社員ビュー、v2_社員ビューのselect権限あり

●組み合わせ所有権を無効にした場合

クエリアナライザからBRISBANEにUserCでログインし、DB_B上のv1_社員ビューとv2_社員ビューを検索します(画面4)。

■ 画面4 UserCがv1_社員ビューとv2_社員ビューを検索(組み合わせ所有権は無効)
(図)UserCがv1_社員ビューとv2_社員ビューを検索(組み合わせ所有権は無効)


【画面4】からおわかりのとおり、UserCはUserAが作成したv1_社員ビューも、UserBが作成したv2_社員ビューも検索できません。すなわち、組み合わせ所有権を無効にした場合は、必ず元のオブジェクトに対して適切な権限を持っていなければいけません。

●組み合わせ所有権を有効にした場合

クエリアナライザからBRISBANEにUserCでログインし、DB_B上のv1_社員ビューとv2_社員ビューを検索します(画面5)。

■ 画面5 UserCがv1_社員ビューとv2_社員ビューを検索(組み合わせ所有権は有効)
(図)UserCがv1_社員ビューとv2_社員ビューを検索(組み合わせ所有権は有効)

【画面5】からおわかりのとおり、UserCはUserAが作成したv1_社員ビューは検索できますが、UserBが作成したv2_社員ビューは検索できません。この結果から、組み合わせ所有権を有効にした場合には、データベース内の所有権の継承と同じ動きをとることがわかります。

組み合わせ所有権は思わぬ危険(エラー)を招く恐れがあるため、無効にしておくことが推奨されています。詳しくは「マイクロソフトサポート技術情報-810474 [INF] SQL Server 2000 Service Pack 3 での複数データベースの組み合わせ所有権の動作の変更点」を参照してください。



〜最後に〜


所有権だけではなく、ロールの設定方法もOracleとSQL Serverとでは異なります。このような権限に関する知識は、きちんと理解しておかないと思わぬ事態を招く場合があります。データベース管理の「基本中の基本」とも言える部分ですので、しっかり勉強してください。




・ 第1回 リモートからSQL Server 2000にアクセスできない?
・ 第2回 ディスクの空き領域がなくなる?
・ 第3回 権限があるのにアクセスできない?
・ 第4回 ジョブが失敗する?
・ 第5回 ログは自動でアーカイブされないの?
・ 第6回 メモリサイズは調整できないの?


著者プロフィール
鈴木 智行(SUZUKI, Tomoyuki)
NEC Eラーニング事業部
http://www.sw.nec.co.jp/el/

入社以来、インストラクタとして教育業務に従事。SQL Serverには、4.21aから携わる。最近はデータベースグループの一員として、より大きな見地からデータベースを担当。

← 特集!DBバイリンガル 目次

PASSJメールニュース 著作権ついて プライバシーポリシー リンクポリシー お問い合わせ
(C) 2005 Professional Association for SQL Server Japan. All rights reserved.