10. データベースの管理
- 10.1. ユーザとアクセス権限
- 10.2. ユーザの作成
- 10.3. アクセス権限
10.1. ユーザとアクセス権限
一般に、構築したデータベースには多くのユーザがアクセスします。 必要なデータを取り出す、登録されたデータをさまざまな角度から分析する、新しいデータを追加する、古いデータを削除する、変更の必要があるデータを修正するなど、いろんな利用形態があります。しかし、誰もがこのようなことができる状態では、データベースが壊されてしまったり、外には見せたくないデータが流出してしまうということが起こりえます。
各 RDBMS はデータベースを利用できるユーザを限定することにより、データベースを保護しています。ユーザを限定すると同時に、参照はできるがデータの追加はできない、データの追加はできるが削除はできないなど、ユーザがデータベースにアクセスできる方法に対しても制限を与えています。
ここでは、構築したデータベースの信頼性と機密性を守るための、ユーザとアクセス権限について説明します。
10.2. ユーザの作成
SQL92 ではユーザを作成する基本構文について定義されていません。そのため、RDBMS 製品でもユーザ作成の構文をサポートしていないものもあります。しかし、各 RDBMS はシステムサイドのプログラム等など何らかの形で、ユーザ作成を行っています。
SQL92 ではユーザ作成の基本構文はありませんが、ここでは参考に ORACLE と PostgreSQL で扱われている基本構文を示します。CREATE USER 文を用いて、ユーザ名とパスワードを指定します。
<ORACLE>CREATE USER ユーザ名 IDENTIFIED BY パスワード ;
<PostgreSQL>
CREATE USER ユーザ名 WITH PASSWORD パスワード ;
各 RDBMS ではユーザを作成すると同時に、スキーマが自動的に作成されます。スキーマとは、テーブルなどのオブジェクトを格納する器のようなものです。スキーマが作成された後に、その中にテーブルやビューなどのオブジェクトを作成することが可能になるのです。ユーザの作成と同時にスキーマは作成されますが、スキーマを明示的に作成することもできます。これを実行する構文は SQL92 でも定義されており、次のような CREATE SCHEMA 文を用います。
CREATE SCHEMA AUTHORIZATION スキーマ名 ;
CREATE SCHEMA 文で指定するスキーマ名は CREATE USER 文で指定したユーザ名と同じでなければなりません。つまり、スキーマとは特定のユーザが所有するオブジェクトの集合と考えることができます。スキーマ名が「AAA」で、その中にあるテーブル「xxx」は、ユーザ「AAA」が作成したテーブル「xxx」だと言い換えることができます。
もし、ほかの人が作ったテーブルを参照するには sample.22-1 のように記述します。ユーザ「BBB」さんが作成したテーブル「yyy」をユーザ「AAA」さんが参照しようとするときの例文です。
-- sample.22-1 --/* 他スキーマのテーブルを参照 */ SELECT * FROM BBB.yyy ;
スキーマ名.テーブル名というように記述して、参照するテーブル名を指定します。
10.3. アクセス権限
アクセス権限とは、スキーマに作成されたテーブルやビューなどのオブジェクトを利用するための権利のことです。アクセス権限は、データの参照だけが行える権限、データの追加・更新が行える権限、データの削除が行える権限などというように細かく設定することが可能です。SQL92 で定義されているアクセス権限は次の表のようになっています。
権限名 | 説明 |
---|---|
SELECT | データの参照 |
INSERT | データの追加 |
UPDATE | データの変更・修正 |
DELETE | データの削除 |
REFERENCES | 他テーブルの外部キーを作成 |
ALL | すべての操作 |
このような権限を与えるための基本構文は次のとおりです。GRANT 文を使用します。
GRANT 権限名 ON オブジェクト名 TO { スキーマ名 | PUBLIC } [ WITH GRANT OPTION ] ;
{ } で囲んだ部分は、スキーマ名または PUBLIC を指定するという意味です。スキーマ名はユーザ名ということになるのですが、このスキーマ名の示すユーザに指定したオブジェクトのアクセス権限を与えるということです。PUBLIC を指定すると、すべてのユーザに権限が与えられます。最後の WITH GRANT OPTION は省略可能ですが、詳細については後述します。
スキーマ「CCC」のユーザに、ユーザ「BBB」が作成したテーブル「yyy」のデータを参照できる権限を与えるときは、sample.22-2 のように記述します。
-- sample.22-2 --/* 権限の割り当て */ GRANT SELECT ON BBB.yyy TO CCC ;
複数の権限を一度に与えることもできます。sample.22-3 はスキーマ「CCC」のユーザに、スキーマ「BBB」のテーブル「yyy」にデータを追加したり、変更を加えることができる権限を与えます。権限をコンマで区切って並べて記述します。
-- sample.22-3 --/* 権限の割り当て */ GRANT INSERT,UPDATE ON BBB.yyy TO CCC ;
これらの権限を与えることができるのは、オブジェクトを所有するユーザです。他ユーザに自分が作成したオブジェクトを利用する権限を与えるときに、GRANT 文を使用して権限を割り当てることができるのです。アクセス権限を与えられたユーザは、その権限を他のユーザに与えることも可能です。しかし、これは GRANT 文の基本構文で示した WITH GRANT OPTION をつけてアクセス権限を付与された場合だけです。WITH GRANT OPTION をつけずにアクセス権限を付与された場合に、他ユーザへ権限を与えようとするとエラーとなります。
アクセス権限を取り消すには REVOKE 文を使用します。REVOKE 文の基本構文は次の通りです。
REVOKE 権限名 ON オブジェクト名 FROM { スキーマ名 | PUBLIC } ;
ユーザ「CCC」に先ほど与えた権限をすべて取り消すには sample.22-4 のように記述します。
-- sample.22-4 --/* 権限の取り消し */ REVOKE ALL ON BBB.yyy TO CCC ;