GRANT — アクセス権限を定義する
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { { FUNCTION | PROCEDURE | ROUTINE }routine_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMAschema_name
[, ...] } TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] TOrole_specification
[, ...] [ WITH GRANT OPTION ] [ GRANTED BYrole_specification
] GRANTrole_name
[, ...] TOrole_specification
[, ...] [ WITH ADMIN OPTION ] [ GRANTED BYrole_specification
] ここでrole_specification
は以下の通りです。 [ GROUP ]role_name
| PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER
GRANT
には基本的に2つの種類があります。
1つはデータベースオブジェクト(テーブル、列、ビュー、外部テーブル、シーケンス、データベース、外部データラッパ、外部サーバ、関数、プロシージャ、手続き言語、スキーマ、テーブル空間)に対する権限の付与、もう1つはロール内のメンバ資格の付与です。
これらの種類は多くの点で似ていますが、説明は別々に行わなければならない程違いがあります。
この種類のGRANT
コマンドはデータベースオブジェクトの特定の権限を1つ以上のロールに付与します。
既に権限が他のロールに付与されている場合でも、追加として付与されます。
PUBLIC
キーワードは、今後作成されるロールを含む、全てのロールへの許可を示します。
PUBLIC
は、全てのロールを常に含む、暗黙的に定義されたグループと考えることができます。
個々のロールは全て、ロールに直接許可された権限、ロールが現在属しているロールに許可された権限、そして、PUBLIC
に許可された権限を合わせた権限を持っています。
WITH GRANT OPTION
が指定されると、権限の受領者は、その後、他にその権限を与えることができます。
グラントオプションがない場合、受領者はこれを行うことができません。
グラントオプションはPUBLIC
には与えることができません。
GRANTED BY
が指定されると、指定された付与する者は現在のユーザでなければなりません。
この句はSQLとの互換性のためにのみ現在この形で存在しています。
所有者(通常はオブジェクトを作成したユーザ)はデフォルトで全ての権限を保持しているため、オブジェクトの所有者に権限を許可する必要はありません (ただし、オブジェクトの作成者が、安全性のために自らの権限を取り消すことは可能です)。
オブジェクトを削除する権限や何らかの方法でオブジェクトの定義を変更する権限は、付与可能な権限として扱われません。 これらの権限は、所有者固有のものであり、許可したり取り消したりすることはできません。 (しかし、オブジェクトを所有するロール内のメンバ関係を付与したり取り消すことで、同等な効果を得ることができます。 後で説明します。) 所有者は、オブジェクトに対する全てのグラントオプションも暗黙的に保持しています。
設定可能な権限は以下のものです。
SELECT
INSERT
UPDATE
DELETE
TRUNCATE
REFERENCES
TRIGGER
CREATE
CONNECT
TEMPORARY
EXECUTE
USAGE
権限の特定の種類です。5.7で定義されています。
TEMP
TEMPORARY
の別の綴り方です。
ALL PRIVILEGES
対象の型に対して利用可能な全ての権限を一度に付与します。
PRIVILEGES
キーワードはPostgreSQLでは省略可能ですが、厳密なSQLでは必須です。
FUNCTION
構文は通常の関数、集約関数、ウィンドウ関数に対して有効ですが、プロシージャには有効ではありません。プロシージャにはPROCEDURE
を使ってください。
あるいは、関数、集約関数、プロシージャを参照するのに、その正確な種類に関係なくROUTINE
を使ってください。
1つまたは複数のスキーマ内で同じ型のオブジェクトすべてに対する権限を付与するオプションもあります。
この機能は現在、テーブル、シーケンス、関数、プロシージャだけをサポートしています。
ALL TABLES
は、特定の対象のGRANT
コマンドと同様に、ビューや外部テーブルにも影響します。
ALL FUNCTIONS
は、集約関数やウィンドウ関数にも影響しますが、プロシージャには影響しません。ここでも、特定の対象のGRANT
コマンドと同様です。
プロシージャを含めるにはALL ROUTINES
を使ってください。
この種類のGRANT
コマンドは、ロール内のメンバ資格を1つ以上の他のロールに付与します。
これによりロールに付与された権限が各メンバに与えられるので、ロール内のメンバ資格は重要です。
WITH ADMIN OPTION
が指定された場合、メンバはロール内のメンバ資格を他に付与することができるようになります。
また同様にロール内のメンバ資格を取り消すこともできるようになります。
アドミンオプションがないと、一般ユーザは他への権限の付与や取り消しを行うことができません。
ロールはそれ自体についてのWITH ADMIN OPTION
を保持しているとはみなされませんが、データベースセッションのユーザがロールにマッチする場合について、ロール内のメンバ資格を付与あるいは取り消しを行うことができます。
データベーススーパーユーザはすべてのロール内のメンバ資格を誰にでも付与したり、取り消したりすることができます。
CREATEROLE
権限を持つロールは、スーパーユーザロール以外の任意のロール内のメンバ資格の付与、取り上げが可能です。
GRANTED BY
が指定された場合、付与は指定されたロールにより行なわれたと記録されます。
コマンドを実行しているのと同じロールの名前を指定する場合を除き、データベーススーパーユーザだけがこのオプションを利用できます。
権限の場合と異なり、ロール内のメンバ資格をPUBLIC
に付与することはできません。
また、このコマンド構文では、role_specification
で無意味なGROUP
という単語を受け付けないことに注意してください。
アクセス権限を取り消すには、REVOKE
コマンドが使用されます。
PostgreSQL 8.1から、ユーザとグループという概念は、ロールと呼ばれる1種類の実体に統合されました。
そのため、付与される者がユーザかグループかどうかを識別するためにGROUP
キーワードを使用する必要はなくなりました。
このコマンドではまだGROUP
を使うことはできますが、何の意味もありません。
ユーザは特定の列あるいはテーブル全体に対する権限を持つ場合にSELECT
、INSERT
などを実行することができます。
テーブルレベルの権限を付与してからある列に対する権限を取り消しても、望むことは実現できません。
テーブルレベルの権限は列レベルの操作による影響を受けないからです。
オブジェクトの所有者でもなく、そのオブジェクトに何の権限も持たないユーザが、そのオブジェクトの権限をGRANT
しようとしても、コマンドの実行は直ちに失敗します。
何らかの権限を持っている限り、コマンドの実行は進行しますが、与えることのできる権限は、そのユーザがグラントオプションを持つ権限のみです。
グラントオプションを持っていない場合、GRANT ALL PRIVILEGES
構文は警告メッセージを発します。
一方、その他の構文では、コマンドで名前を指定した権限に関するグラントオプションを持っていない場合に警告メッセージを発します
(原理上、ここまでの説明はオブジェクトの所有者に対しても当てはまりますが、所有者は常に全てのグラントオプションを保持しているものとして扱われるため、こうした状態は決して起こりません)。
データベーススーパーユーザは、オブジェクトに関する権限設定に関係なく、全てのオブジェクトにアクセスできることには注意しなければなりません。
スーパーユーザが持つ権限は、Unixシステムにおけるroot
権限に似ています。
root
と同様、どうしても必要という場合以外は、スーパーユーザとして操作を行わないのが賢明です。
スーパーユーザがGRANT
やREVOKE
の発行を選択した場合、それらのコマンドは対象とするオブジェクトの所有者が発行したかのように実行されます。
特に、こうしたコマンドで与えられる権限は、オブジェクトの所有者によって与えられたものとして表されます。
(ロールのメンバ資格では、メンバ資格は含まれるロール自身が与えたものとして表されます。)
GRANT
およびREVOKE
は、対象のオブジェクトの所有者以外のロールによって実行することもできますが、
オブジェクトを所有するロールのメンバであるか、そのオブジェクトに対しWITH GRANT OPTION
権限を持つロールのメンバでなければなりません。
この場合、その権限は、そのオブジェクトの実際の所有者ロールまたはWITH GRANT OPTION
権限を持つロールによって付与されたものとして記録されます。
例えば、テーブルt1
がロールg1
によって所有され、ロールu1
がロールg1
のメンバであるとします。
この場合、u1
はt1
に関する権限をu2
に付与できます。
しかし、これらの権限はg1
によって直接付与されたものとして現れます。
後でロールg1
の他のメンバがこの権限を取り消すことができます。
GRANT
を実行したロールが、ロールの持つ複数メンバ資格の経路を通して間接的に必要な権限を持つ場合、
どのロールが権限を付与したロールとして記録されるかについては指定されません。
こうした場合、SET ROLE
を使用して、GRANT
を行わせたい特定のロールになることを推奨します。
テーブルへの権限付与によって、SERIAL
列によって関連付けされたシーケンスを含め、そのテーブルで使用されるシーケンスへの権限の拡張は自動的に行われません。
シーケンスへの権限は別途設定しなければなりません。
特定の権限の種類に関するより詳しい情報や、対象の権限を調査する方法は5.7を参照してください。
テーブルfilms
にデータを追加する権限を全てのユーザに与えます。
GRANT INSERT ON films TO PUBLIC;
ビューkinds
における利用可能な全ての権限を、ユーザmanuel
に与えます。
GRANT ALL PRIVILEGES ON kinds TO manuel;
上のコマンドをスーパーユーザやkinds
の所有者が実行した場合は、全ての権限が付与されますが、他のユーザが実行した場合は、そのユーザがグラントオプションを持つ権限のみが付与されることに注意してください。
ロールadmins
内のメンバ資格をユーザjoe
に与えます。
GRANT admins TO joe;
標準SQLでは、ALL PRIVILEGES
内のPRIVILEGES
キーワードは必須です。
標準SQLでは、1つのコマンドで複数のオブジェクトに権限を設定することはサポートしていません。
PostgreSQLでは、オブジェクトの所有者は、自身が持つ権限を取り消すことができます。
例えば、テーブル所有者は自身のINSERT
、UPDATE
、DELETE
、TRUNCATE
権限を取り消すことで、自分にとってそのテーブルが読み取り専用になるよう変更することができます。
これは、標準SQLでは不可能です。
PostgreSQLでは、所有者の権限を、所有者自身により与えられたものとして扱っているため、同様に所有者自身で権限を取り消すことができるようになっています。
標準SQLでは、所有者の権限は仮想的なエンティティ「_SYSTEM」によって与えられたものとして扱っています。
所有者は「_SYSTEM」ではないため、その権限を取り消すことができません。
標準SQLにしたがうと、グラントオプションはPUBLIC
に対して与えることができます。
PostgreSQLではグラントオプションはロールに対して与えることのみをサポートしています。
標準SQLでは、GRANTED BY
オプションに指定できるのはCURRENT_USER
とCURRENT_ROLE
だけです。
その他のものはPostgreSQLの拡張です。
標準SQLでは、文字セット、照合順序、翻訳といったその他の種類のオブジェクトに対して、USAGE
権限を付与することができます。
標準SQLでは、シーケンスはUSAGE
権限のみを持ちます。
これはPostgreSQLにおけるnextval
関数と等価なNEXT VALUE FOR
式の使用を制御するものです。
シーケンスに関するSELECT
権限とUPDATE
権限はPostgreSQLの拡張です。
シーケンスに関するUSAGE
権限がcurrval
関数にも適用される点もPostgreSQLの拡張です(この関数自体が拡張です)。
データベース、テーブル空間、スキーマ、言語についての権限はPostgreSQLの拡張です。