InterBase クイック スタート:Part V - アクセス権限
InterBase クイック スタート:Part V - 応用トピック へ戻る
このセクションは、重要なトピック「セキュリティ」への、本当に簡単な紹介にすぎません。 セキュリティの詳細については、『データ定義ガイド』のセクション「セキュリティの計画」を参照してください。
初期状態では、テーブルの作成者、テーブルの所有者、および、SYSDBA ユーザーのみが、テーブルへのアクセス権を持っています。 superuser もしくは root 権限を持つユーザーが存在する UNIX サーバー上では、これらのユーザーもすべてのデータベース オブジェクトへの権限を持っています。
他のユーザーには、GRANT
文を使って アクセス権限を割り当てることにより、テーブルを確認または変更する権限を与えることができます。 GRANT
文は、テーブルやビューへのアクセス権限を、特定のユーザー、ロール、プロシージャに対して割り当てます。 REVOKE
文は、先に与えたアクセス権限を削除します。
以下の表は、利用可能はアクセス権限のリストです:
権限 | アクセス |
---|---|
|
|
|
データの読み込み |
|
データの削除 |
|
データの挿入 |
|
データの変更 |
|
ストアド プロシージャの実行または呼び出し |
|
外部キーでの主キー参照 |
|
そのロールに割り当てられたすべての権限 |
目次
GRANT による権限の割り当て
GRANT
文は、1 つまたは複数の権限を、1 人または複数のユーザーに対して与えることができます。 それらの権限は、1 つまたは複数のテーブル全体に対して設定することもできますし、テーブルの特定の列に限定することもできます。 UPDATE
と REFERENCES
の権限のみ、列レベルで割り当てることができます。
テーブル全体に対するアクセス権を与える
次の文では、department
テーブルに対する権限を、一人のユーザーに与えます:
GRANT SELECT ON department TO emil
次の文は、department
テーブルに対する 2 つの権限を、3 人のユーザーに割り当てます:
GRANT INSERT, UPDATE ON department TO emil, ravi, helga
全員に権限を与えるには、PUBLIC
キーワードを使用します。 次の文は、Department
テーブルに対する EXECUTE
以外のすべての権限を、データベースに接続したすべての者に与えます:
GRANT ALL ON department TO PUBLIC
列に対するアクセス権を与える
テーブル全体へのアクセスを許可する代わりに、テーブルの特定の列にだけアクセスを許可したい場合がよくあります。 次の文は、customer
テーブルの contact
および phone
列に対する UPDATE
権限を、すべてのユーザーに割り当てます:
GRANT UPDATE ON (contact, phone) ON customer TO PUBLIC
権限を取り消す
REVOKE
文は、テーブルやビューに対する、特定のユーザー、ロール、プロシージャのアクセス権限を、削除します。次の文は、前の例で Emil、Ravi、Helga に対して与えられた department
テーブルに対する挿入、更新権限を、削除します。
REVOKE INSERT, UPDATE ON department FROM emil, ravi, helga
ロールを利用したセキュリティの制御
ロールは、権限の名前がつけられたグループです。
たとえば、企業が、営業社員に特定の権限のセットを、経理スタッフに別の権限のセットを与えたいと考えてるとしましょう。 いずれの場合にも、権限のセットは非常に複雑なものになります。 ロールがないと、営業や経理の新しい社員が企業に入ってくるたびに、長く煩雑な GRANT
文を使用しなければなりません。 それを、ロールを使用することで避けることができます。
ロールの実装は、4 ステップの処理で行います:
- ロールを定義する
CREATE ROLE role_name
- 権限をロールに割り当てる
GRANT privilege_list ON table_name TO role_name
privilege_list = one OR more OF INSERT, UPDATE, DELETE, SELECT, REFERENCES, EXECUTE
注意:
EXECUTE
は、常に、個別の文で割り当てられなければなりません。または
GRANT [UPDATE],[REFERENCES] (col_name, [col_name 2, ...]) ON table_name TO role_name
- ロールをユーザーに割り当てる
これでユーザーが、
GRANT role_name TO user_name1, [user_name2, ...]
role_name
ロールに相当するすべての権限を持ちました。 しかし、これらの権限が利用できるようになるには、もう 1 ステップあります。 データベースに接続する際に、ロールを指定しなければなりません。 - データベースへ接続する際にロールを指定する
アクセス制御にロールを使用する
先に進む前に、ここで作業をコミットしましょう。これにより、何かうまくいかなくなっても、この時点までロールバックすることができます。
この演習では、ロールを実装するための 4 つのステップすべてを行い、ロールをユーザーに割り当てます。
- サーバーからログアウトします。
Tutorial
データベースから切断します。- サーバーに、ユーザー
SYSDBA
でログインします。 - 新しい ユーザーを作成します:
- ユーザー名を
CHRIS
に設定。 - パスワードを
chris4ib
に設定。
- ユーザー名を
Tutorial
データベースにユーザーCHRIS
で接続します(データベース > 名前を指定して接続... を使用)。- 次の文を実行します:
SELECT * FROM Sales
InterBase は、エラー プロンプトを表示します。これは、上の文の中で参照するテーブルのすべてが、ユーザー
TUTOR
に属するからです。ユーザーCHRIS
には、このチュートリアルの間に作成したテーブルに対して、何かを行う権限がありません。 Tutorial
データベースから切断し、TUTOR
で再接続します。salespeople
というロールを作成します。CREATE ROLE salespeople
- 次の
GRANT
文を実行して、salespeople
ロールに権限を割り当てます。GRANT SELECT, UPDATE, INSERT ON sales TO salespeople
GRANT UPDATE (contact_first, contact_last, phone_no) ON customer TO salespeople
GRANT salespeople TO chris
Tutorial
データベースから切断し、CHRIS
で再接続します。 データベース接続 ダイアログで、salespeople
をロールとして指定しなければなりません。- ステップ 5 から、クエリを入力します。今度は、InterBase InterBase が
Sales
テーブルからすべての行を抽出してきます。なぜなら、ユーザーCHRIS
が必要な権限を持つようになったからです。CREATE ROLE salespeople
Tutorial
データベースから切断し、TUTOR
で再接続します。