GRANT — アクセス権限を定義する
GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER }
[, ...] | ALL [ PRIVILEGES ] }
ON { [ TABLE ] table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( column_name [, ...] )
[, ...] | ALL [ PRIVILEGES ] ( column_name [, ...] ) }
ON [ TABLE ] table_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { USAGE | SELECT | UPDATE }
[, ...] | ALL [ PRIVILEGES ] }
ON { SEQUENCE sequence_name [, ...]
| ALL SEQUENCES IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] }
ON DATABASE database_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON DOMAIN domain_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN DATA WRAPPER fdw_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON FOREIGN SERVER server_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { EXECUTE | ALL [ PRIVILEGES ] }
ON { { FUNCTION | PROCEDURE | ROUTINE } routine_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...]
| ALL { FUNCTIONS | PROCEDURES | ROUTINES } IN SCHEMA schema_name [, ...] }
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON LANGUAGE lang_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] }
ON LARGE OBJECT loid [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] }
ON SCHEMA schema_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { CREATE | ALL [ PRIVILEGES ] }
ON TABLESPACE tablespace_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT { USAGE | ALL [ PRIVILEGES ] }
ON TYPE type_name [, ...]
TO role_specification [, ...] [ WITH GRANT OPTION ]
[ GRANTED BY role_specification ]
GRANT role_name [, ...] TO role_specification [, ...]
[ WITH ADMIN OPTION ]
[ GRANTED BY role_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との互換性のためにのみ現在この形で存在しています。
所有者(通常はオブジェクトを作成したユーザ)はデフォルトで全ての権限を保持しているため、オブジェクトの所有者に権限を許可する必要はありません (ただし、オブジェクトの作成者が、安全性のために自らの権限を取り消すことは可能です)。
オブジェクトを削除する権限や何らかの方法でオブジェクトの定義を変更する権限は、付与可能な権限として扱われません。 これらの権限は、所有者固有のものであり、許可したり取り消したりすることはできません。 (しかし、オブジェクトを所有するロール内のメンバ関係を付与したり取り消すことで、同等な効果を得ることができます。 後で説明します。) 所有者は、オブジェクトに対する全てのグラントオプションも暗黙的に保持しています。
設定可能な権限は以下のものです。
SELECTINSERTUPDATEDELETETRUNCATEREFERENCESTRIGGERCREATECONNECTTEMPORARYEXECUTEUSAGE権限の特定の種類です。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の拡張です。