★PostgreSQLカンファレンス2024 12月6日開催/チケット販売中★
他のバージョンの文書 16 | 15 | 14 | 13 | 12 | 11 | 10 | 9.6 | 9.5 | 9.4 | 9.3 | 9.2 | 9.1 | 9.0 | 8.4 | 8.3 | 8.2 | 8.1 | 8.0 | 7.4 | 7.3 | 7.2

5.7. 権限

オブジェクトが作成されると、所有者が割り当てられます。通常、所有者は作成する文を実行したロールです。ほとんどの種類のオブジェクトについて、初期状態では所有者(またはスーパーユーザ)だけがそのオブジェクトを使用できます。 他のユーザがこのオブジェクトを使用するには、権限が付与されていなければなりません。

権限にはいくつかの種類があります。 すなわちSELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGEです。 特定のオブジェクトに適用可能な権限は、オブジェクトの型(テーブル、関数など)により変わります。 これらの権限の詳細な意味を以下に示します。 以降の節および章でもこれらの権限の使用方法についての説明があります。

オブジェクトの変更や削除の権限は所有者に固有のもので、それ自体を許可したり取り消したりはできません (しかし、すべての権限同様、その権限を所有者のロールのメンバーが継承することはできます。21.3をご覧ください)。

たとえば次のように、オブジェクトに対する適切な種類のALTERコマンドにより、あるオブジェクトに新しい所有者を割り当てることができます。

ALTER TABLE table_name OWNER TO new_owner;

スーパーユーザはいつでも所有者を変更できます。通常のロールは、対象オブジェクトの現在の所有者(または所有者ロールのメンバー)であり、かつ新しい所有者ロールのメンバーである場合に限り、所有者を変更できます。

権限を割り当てるには、GRANTコマンドを使用します。 例えば、joeという既存のロールとaccountsという既存のテーブルがある場合、このテーブルを更新する権限を付与するには以下のようにします。

GRANT UPDATE ON accounts TO joe;

特定の権限名を指定する代わりにALLを指定すると、その種類のオブジェクトに関連する全ての権限が付与されます。

システム内の全てのロールに権限を付与するには、特別なロール名であるPUBLICを使用することができます。 また、グループロールを使用すれば、データベース内に多くのユーザが存在する場合に権限の管理が簡単になります。 詳細は第21章を参照してください。

以前与えられた権限を取り消す(revoke)には、それに相応しい名前のREVOKEコマンドを使用します。

REVOKE ALL ON accounts FROM PUBLIC;

普通はオブジェクトの所有者(またはスーパーユーザ)だけが、オブジェクトにおける権限の付与や剥奪ができます。 しかしwith grant optionを付けることで、権限を与えられたユーザが、所有者と同様に他のユーザに権限を付与することが可能になります。 もし後になってグラントオプションが剥奪されると、剥奪されたユーザから(直接もしくは権限付与の連鎖により)権限を与えられていたユーザはすべて、その権限が剥奪されます。 詳細は、GRANTREVOKEを参照してください。

オブジェクトの所有者は、所有する通常の権限を削除することを選択できます。たとえば、他のものと同様、自身のためにテーブルを読み取り専用にできます。 しかし、所有者は常にすべての付与オプションを持つものとして扱われます。ですから、いつでも自身の権限を再び付与することができます。

可能な権限は以下です。

SELECT

テーブル、ビュー、マテリアライズドビュー、あるいはそれ以外のテーブルのように見えるオブジェクトに対してSELECTをある列、あるいは指定した列(複数可)に許可します。 また、COPYの利用を許可します。 この権限はUPDATEあるいはDELETEにおいて既存の列を参照する場合にも必要になります。 シーケンスにおいてはこの権限はcurrval関数の使用を許可します。 ラージオブジェクトにおいてはこの権限はオブジェクトの読み出しを許可します。

INSERT

テーブル、ビューなどに新しい行をINSERTすることを許可します。 特定の列だけをINSERTコマンドで指定したい場合に、それらの列に許可することができます。 (したがって他の列にはデフォルトが設定されます)。 COPY FROMを利用することもできます。

UPDATE

テーブル、ビューなどの列をUPDATEすることを許可します。 (実用的には、簡単ではないUPDATEコマンドにはSELECT権限も必要になります。 どの行を更新するかを決定したり、列に対して新しい値を計算するためにテーブルの列を参照しなければならないからです。) SELECT ... FOR UPDATESELECT ... FOR SHARESELECT権限に加えて更にこの権限が必要になります。 シーケンスではこの権限はnextvalsetval関数の利用を許可します。 ラージオブジェクトではこの権限はオブジェクトへの書き込みあるいは切り詰めを行うことを許可します。

DELETE

テーブル、ビューなどの列をDELETEすることを許可します。 (実用的には、簡単ではないDELETEコマンドにはSELECT権限も必要になります。 どの行を削除するかを決定するためにテーブルの列を参照しなければならないからです。)

TRUNCATE

テーブルあるいはビューのTRUNCATEを許可します。

REFERENCES

テーブルあるいはテーブルの特定の列を参照する外部キー制約を作ることを許可します。

TRIGGER

テーブルあるいはビューにトリガを作ることを許可します。

CREATE

データベースに対して、データベース内に新しいスキーマとパブリケーションを作ること、信頼できる拡張をデータベース内に作成することを許可します。

スキーマに対して、スキーマ内に新しいオブジェクトを作ることを許可します。 既存のオブジェクトの名前を変えるには、オブジェクトを所有するとともにそのオブジェクトを含むスキーマに対してこの権限を持っていなければなりません。

テーブル空間に対しては、そのテーブル空間内にテーブル、インデックス、一時ファイルを作ることを許可し、そのテーブル空間をデフォルトのテーブル空間として持つデータベースを作ることを許可します。

この権限を剥奪しても既存のオブジェクトの存在、あるいはその配置を変更しないことに注意してください。

CONNECT

権限を与えられた者がデータベースに接続することを許可します。 (pg_hba.confが課す制限の検査に加えて)この権限は接続の開始時に検査されます。

TEMPORARY

データベース使用中に一時テーブルを作成することを許可します。

EXECUTE

関数上に実装された演算子を含めて関数あるいはプロシージャの呼び出しを許可します。 これは関数とプロシージャに適用される唯一のタイプの権限です。

USAGE

手続き言語に対して、言語内で関数を作るために言語を使用することを許可します。 これは手続き言語に適用される唯一のタイプの権限です。

スキーマに対しては、(オブジェクト自身の権限要件が満たされているものと仮定した上で)スキーマ内に含まれるオブジェクトへのアクセスを許可します。 本質的に、これは権限を授与されたものがスキーマ内のオブジェクトを検査することを許可します。 この許可がなくても依然としてオブジェクト名を見ることを可能です。たとえば、システムカタログを問い合わせることによってです。 また、この許可を剥奪した後でも、既存のセッションはすでにこの検査を実施していると主張するかも知れません。 ですからこれはオブジェクトへのアクセスを妨げる完全にセキュアな方法ではありません。

シーケンスに対しては、currvalnextval関数の利用を許可します。

型とドメインに対しては、テーブル、関数、および他のスキーマオブジェクトを生成する際に型とドメインを使用することを許可します。 (たとえば問い合わせ中に表れる型の値のような、すべての型の利用をこの権限はコントロールするわけではないことに注意してください。 その型に依存するオブジェクトが作られるのを防ぐだけです。 この権限の主な目的は、どのユーザがある型への依存関係を作ることができるかを制御し、後で所有者がこの型を変更するのを防ぐためです。)

外部データラッパーに対しては、その外部データラッパーを使って新しいサーバを作ることを許可します。

外部サーバに対しては、そのサーバを使って外部テーブルを作ることを許可します。 権限を授与されたものは、そのサーバに結びついたユーザマッピングを作成、変更、削除することができます。

他のコマンドで必要となる権限はそれぞれのコマンドのリファレンスページに列挙されています。

PostgreSQLはあるタイプのオブジェクトが作成された時に、そのオブジェクトに対する権限をデフォルトでPUBLICに付与します。 テーブル、テーブルの列、シーケンス、外部データラッパー、外部サーバ、ラージオブジェクト、スキーマ、テーブル空間に対しては、デフォルトではPUBLICに権限を付与しません。 他のタイプのオブジェクトに対しては、PUBLICにデフォルトで付与される権限は次のものです。 CONNECTTEMPORARY (データベース内で一時テーブルを作成する権限)、関数とプロシージャに対するEXECUTE権限、言語とデータ型(ドメインを含む)に対するUSAGE権限。 もちろんオブジェクトの所有者は、デフォルト、あるいは明示的に与えられた権限をREVOKEできます。 (セキュリティを最大限に高めるためには、REVOKEをオブジェクトを作成したのと同じトランザクション内で発行してください。そうすれば他のユーザがそのオブジェクトを使う隙が存在しません。) また、デフォルトの権限設定はALTER DEFAULT PRIVILEGESを使って上書きできます。

表 5.1に、ACL(Access Control List)値において権限タイプに使われる1文字の短縮形を示します。 psqlの出力、あるいはシステムカタログのACL列を参照することでこれらの文字を見ることができます。

表5.1 ACL短縮形

権限短縮形適用可能なオブジェクトタイプ
SELECTr (read) LARGE OBJECT, SEQUENCE, TABLE(およびテーブルのようなオブジェクト)、テーブルの列
INSERTa (append)TABLE、テーブルの列
UPDATEw (write) LARGE OBJECT, SEQUENCE, TABLE, テーブルの列
DELETEdTABLE
TRUNCATEDTABLE
REFERENCESxTABLE、テーブルの列
TRIGGERtTABLE
CREATEC DATABASE, SCHEMA, TABLESPACE
CONNECTcDATABASE
TEMPORARYTDATABASE
EXECUTEXFUNCTION, PROCEDURE
USAGEU DOMAIN, FOREIGN DATA WRAPPER, FOREIGN SERVER, LANGUAGE, SCHEMA, SEQUENCE, TYPE

表 5.2は、前述の短縮形を用いてそれぞれのタイプのSQLオブジェクトで利用可能な権限をまとめています。 また、それぞれのオブジェクトタイプの権限設定を調べる際に利用できるpsqlコマンドを示します。

表5.2 アクセス権限のまとめ

オブジェクトタイプすべての権限デフォルトPUBLIC権限psqlコマンド
DATABASECTcTc\l
DOMAINUU\dD+
FUNCTION or PROCEDUREXX\df+
FOREIGN DATA WRAPPERUnone\dew+
FOREIGN SERVERUnone\des+
LANGUAGEUU\dL+
LARGE OBJECTrwnone 
SCHEMAUCnone\dn+
SEQUENCErwUnone\dp
TABLE(およびテーブルのようなオブジェクト)arwdDxtnone\dp
テーブルの列arwxnone\dp
TABLESPACECnone\db+
TYPEUU\dT+

あるオブジェクトに与えられている権限はaclitemエントリのリストとして表示されます。 そこでは、aclitemはある権限付与者によって与えられている権限授与者の許可を示しています。 たとえば、calvin=r*w/hobbesは、ロールcalvinが許可オプション(*)ありのSELECTr)と許可オプションなしのUPDATE (w)を持ち、それらがロールhobbesに与えられていることを示します。 別の権限付与者によって権限が与えられている同じオブジェクトに対してcalvinも権限を持っている場合は、別のaclitemエントリとして表示されます。 aclitemの権限授与者フィールドが空であれば、それはPUBLICを表します。

ユーザmiriamがテーブルmytableを作成し、以下を行う例を考えます。

GRANT SELECT ON mytable TO PUBLIC;
GRANT SELECT, UPDATE, INSERT ON mytable TO admin;
GRANT SELECT (col1), UPDATE (col1) ON mytable TO miriam_rw;

すると、psql\dpコマンドは次のように表示するはずです。

=> \dp mytable
                                  Access privileges
 Schema |  Name   | Type  |   Access privileges   |   Column privileges   | Policies
--------+---------+-------+-----------------------+-----------------------+----------
 public | mytable | table | miriam=arwdDxt/miriam+| col1:                +|
        |         |       | =r/miriam            +|   miriam_rw=rw/miriam |
        |         |       | admin=arw/miriam      |                       |
(1 row)

あるオブジェクトに対してAccess privileges列が空なら、そのオブジェクトがデフォルトの権限を持つことを意味します。 (つまり、関連するシステムカタログの権限エントリがNULLだということです。) デフォルト権限は常に所有者の全権限を含み、更に上で説明示したようにオブジェクトタイプ依存のPUBLICに対する権限を持つことができます。 オブジェクトに対する初回のGRANTあるいはREVOKEにより、デフォルト権限(たとえばmiriam=arwdDxt/miriam)が設定され、次に特定の要求に従って変更されます。 同様に、Column privilegesに示されるエントリは非デフォルトの権限を持つ列のためだけのものです。 (注意:デフォルト権限は常にオブジェクトのタイプの組み込みのデフォルト権限を意味します。 ALTER DEFAULT PRIVILEGESコマンドによって権限が影響を受けるオブジェクトは常にALTERの影響を含む明示的な権限エントリを伴って示されます。)

所有者の暗黙的な許可オプションはアクセス権限表示では印を付けられないことに注意してください。 *は許可オプションが明示的に誰かに許可されたときにのみ現れます。