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 { { SET | ALTER SYSTEM } [, ... ] | ALL [ PRIVILEGES ] } ON PARAMETERconfiguration_parameter
[, ...] 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 | INHERIT | SET } { OPTION | TRUE | FALSE } ] [ 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
SET
ALTER SYSTEM
権限の特定の種類です。5.7で定義されています。
TEMP
TEMPORARY
の別の綴り方です。
ALL PRIVILEGES
対象の型に対して利用可能な全ての権限を一度に付与します。
PRIVILEGES
キーワードはPostgreSQLでは省略可能ですが、厳密なSQLでは必須です。
FUNCTION
構文は通常の関数、集約関数、ウィンドウ関数に対して有効ですが、プロシージャには有効ではありません。プロシージャにはPROCEDURE
を使ってください。
あるいは、関数、集約関数、プロシージャを参照するのに、その正確な種類に関係なくROUTINE
を使ってください。
1つまたは複数のスキーマ内で同じ型のオブジェクトすべてに対する権限を付与するオプションもあります。
この機能は現在、テーブル、シーケンス、関数、プロシージャだけをサポートしています。
ALL TABLES
は、特定の対象のGRANT
コマンドと同様に、ビューや外部テーブルにも影響します。
ALL FUNCTIONS
は、集約関数やウィンドウ関数にも影響しますが、プロシージャには影響しません。ここでも、特定の対象のGRANT
コマンドと同様です。
プロシージャを含めるにはALL ROUTINES
を使ってください。
この種類のGRANT
コマンドは、ロール内のメンバ資格を1つ以上の他のロールに付与し、メンバ資格のオプションSET
、INHERIT
、ADMIN
を変更します。詳しくは22.3を参照してください。
これにより各メンバがロールに付与された権限にアクセスできるようになる可能性があり、またロール自身を変更する能力が与えられる可能性があるので、ロール内のメンバ資格は重要です。
ただし、付与される実際の権限は、付与に関連付けられたオプションによって異なります。
既存のメンバ資格のオプションを変更するには、更新するオプションの値を付けてメンバ資格を指定するだけです。
以下の各オプションは、TRUE
またはFALSE
のいずれかに設定できます。
キーワードOPTION
はTRUE
の同義語として受け入れられますので、WITH ADMIN OPTION
はWITH ADMIN TRUE
の同義語です。
既存のメンバ資格を変更するとき、オプションを省略すると現在の値が保持されます。
ADMIN
オプションを使用すると、メンバはロールのメンバ資格を他のメンバに付与したり、ロールのメンバ資格を取り消したりすることができます。
アドミンオプションがないと、一般ユーザは他への権限の付与や取り消しを行うことができません。
ロールは自分自身に対してWITH ADMIN OPTION
を保持しているとはみなされません。
データベーススーパーユーザはすべてのロール内のメンバ資格を誰にでも付与したり、取り消したりすることができます。
このオプションのデフォルトはFALSE
です。
INHERIT
オプションは新しいメンバ資格の継承状態を制御します。継承の詳細については22.3を参照してください。
TRUE
に設定すると、新しいメンバは付与されたロールから継承します。
FALSE
に設定すると、新しいメンバは継承しません。
新しいロールメンバ資格の作成時に指定しない場合、これが新しいメンバの継承属性のデフォルトです。
SET
オプションがTRUE
に設定されている場合、SET ROLE
コマンドを使用して、メンバを付与されたロールに変更できます。
あるロールが別のロールの間接メンバである場合、それぞれSET TRUE
を持つ権限付与のチェーンがある場合にのみ、SET ROLE
を使用してそのロールに変更できます。
このオプションのデフォルトはTRUE
です。
別のロールが所有するオブジェクトを作成する場合、または既存のオブジェクトの所有権を別のロールに付与する場合は、そのロールに対してSET ROLE
を実行できることが必要です。
そうでない場合、ALTER ... OWNER TO
やCREATE DATABASE ... OWNER
などのコマンドは失敗します。
ただし、ロールの権限を継承しているものの、そのロールに対してSET ROLE
を実行できないユーザは、そのロールが所有する既存のオブジェクトを操作することで、そのロールに対して完全なアクセスを取得できるかもしれません(たとえば、既存の関数を再定義してトロイの木馬として機能させることができます)。
したがって、ロールの権限を継承するものの、SET ROLE
を介してアクセスできないようにする場合は、いかなるSQLオブジェクトも所有すべきではありません。
GRANTED BY
が指定された場合、付与は指定されたロールにより行なわれたと記録されます。
ユーザが別のロールに権限を付与できるのは、そのロールの権限を所有している場合のみです。
付与者として記録されるロールは、対象のロールに対してADMIN OPTION
を持っていることが必要です。ただし、ブートストラップスーパーユーザの場合は除きます。
ブートストラップスーパーユーザ以外の付与者を持っていると記録されている付与は、そのロールに対してADMIN OPTION
を引き続き所有している付与者に依存します。したがって、ADMIN OPTION
が取り消された場合、依存する付与も取り消さなければなりません。
権限の場合と異なり、ロール内のメンバ資格を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の拡張です。