REVOKE — アクセス権限を取り消す
REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ]table_name
[, ...] | ALL TABLES IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } (column_name
[, ...] ) [, ...] | ALL [ PRIVILEGES ] (column_name
[, ...] ) } ON [ TABLE ]table_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCEsequence_name
[, ...] | ALL SEQUENCES IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASEdatabase_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAINdomain_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPERfdw_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVERserver_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTIONfunction_name
[ ( [ [argmode
] [arg_name
]arg_type
[, ...] ] ) ] [, ...] | ALL FUNCTIONS IN SCHEMAschema_name
[, ...] } FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGElang_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECTloid
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMAschema_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACEtablespace_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPEtype_name
[, ...] FROM { [ GROUP ]role_name
| PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ]role_name
[, ...] FROMrole_name
[, ...] [ CASCADE | RESTRICT ]
REVOKE
コマンドは、1つ以上のロールに対して、以前に与えた権限を取り消します。
PUBLIC
キーワードは暗黙的に定義された全ロールからなるグループです。
権限の種類の意味についてはGRANTコマンドの説明を参照してください。
全てのロールは、そのロールに直接許可された権限、現在属しているロールに許可された権限、PUBLIC
に許可された権限という3つの権限を合わせた権限を持っていることに注意してください。
したがって、例えば、PUBLIC
からSELECT
権限を取り消すことは、必ずしも全てのロールがそのオブジェクトに対するSELECT
権限を失うことを意味しません。
権限が直接許可されているロール、あるいは、別ロール経由で許可されているロールは、SELECT
権限を持ち続けます。
同様にユーザからSELECT
を取り消しても、PUBLIC
またはメンバとして属する他のロールがSELECT
権限を持つ場合、SELECT
の使用を拒否できません。
GRANT OPTION FOR
が指定された場合、権限自体ではなく、その権限のグラントオプションのみが取り消されます。
指定されていなければ、権限とグラントオプションの両方が取り消されます。
グラントオプション付きの権限を保持しているユーザが、その権限を他ユーザに与えていた場合、与えられたユーザが保持する権限は依存権限と呼ばれます。
権限を与えたユーザ自身の権限やグラントオプションが取り消され、その権限に依存権限が存在する場合、CASCADE
が指定されていると依存権限も取り消されます。指定されていなければ、権限の取り消しが失敗します。
この再帰的な権限の取り消しは、ユーザ権限の連鎖を通じて与えられた権限の中でも、REVOKE
を実行されたユーザから追跡可能な範囲にのみ影響します。
したがって、依存権限を持つユーザが他のユーザからも同じ権限を与えられている場合は、REVOKE
が実行された後もその権限を保持している可能性があります。
テーブルの権限を取り消す場合、対応する列の権限(もしあれば)も自動的に、そのテーブルの各列から取り消されます。 一方、ロールがテーブルに対する権限を持つ場合、個々の列から同じ権限を取り消しても影響ありません。
ロールのメンバ資格を取り消す場合、同様に振舞いますが、GRANT OPTION
はADMIN OPTION
と呼ばれます。
また、このコマンド構文では無意味なGROUP
という単語を受け付けないことに注意してください。
既存のテーブルや列に付与された権限を表示するためにはpsqlの\dp
コマンドを使用してください。
この書式についてはGRANTを参照してください。
テーブル以外のオブジェクトについて、その権限を表示することができる他の\d
コマンドが存在します。
取り消すことができるのは、ユーザが直接付与した権限のみです。
例えば、もし、ユーザAがグラントオプションを付けてユーザBに権限を与え、その後、ユーザBがユーザCにその権限を与えたとすると、ユーザAはユーザCの権限を直接取り消すことはできません。
その代わり、ユーザAがユーザBのグラントオプションをCASCADE
オプション付きで取り消すことで、ユーザCに与えられた権限を取り消すことができます。
別の状況を考えてみます。AとBの両方が同じ権限をCに与えた場合、AはAの与えた権限を取り消すことはできますが、Bの与えた権限を取り消すことはできません。
したがって、Cは実質的にその権限を持ち続けることになります。
オブジェクトの所有者以外がそのオブジェクト上の権限に対してREVOKE
を実行した場合、ユーザがオブジェクトに対して何の権限も持っていなければ、即座にコマンドが失敗します。
何らかの権限があればコマンド処理が続行されますが、取り消すことができるのはそのユーザがグラントオプションを持つ権限のみです。
REVOKE ALL PRIVILEGES
構文をまったく権限を持たない状態で実行すると、警告が出力されます。
他の構文の場合は、そのコマンドで指定した権限に対するグラントオプションを持たない状態で実行すると、警告が出力されます
(原理上、上記の説明はオブジェクト所有者にも適用されますが、所有者は常に全てのグラントオプションを保持しているので、こうした問題が発生することはありません)。
スーパーユーザがGRANT
やREVOKE
コマンドを発行した場合、そのコマンドは、対象のオブジェクトの所有者によって発行されたものであるかのように動作します。
根本的には全ての権限はオブジェクトの所有者から渡されるものなので(ただし、グラントオプションの連鎖により間接的に渡される場合もありますが)、スーパーユーザは、全ての権限を取り消すことができます。
ただし、この場合は上述のCASCADE
を使用する必要があります。
REVOKE
は、対象のオブジェクトの所有者以外のロールによって実行することもできますが、
オブジェクトを所有するロールのメンバであるか、そのオブジェクトに対しWITH GRANT OPTION
権限を持つロールのメンバでなければなりません。
この場合、
そのオブジェクトの実際の所有者ロールまたはWITH GRANT OPTION
権限を持つロールによって発行されたかのように、このコマンドは実行されます。
例えば、t1
テーブルがg1
ロールによって所有され、u1
がg1
ロールのメンバであるとします。
この場合、u1
はg1
で付与されたものと記録されている権限を取り消すことができます。
これには、u1
が付与した権限とg1
ロールの他のメンバによって付与された権限が含まれます。
REVOKE
を実行したロールが、ロールの持つ複数メンバ資格の経路を通して間接的に必要な権限を持つ場合、このコマンドがどのロールで実行されたかについては指定されません。
こうした場合、SET ROLE
を使用して、REVOKE
を行わせたい特定のロールになることを推奨します。
こうしないと、意図しない権限を取り消すことになったり、取り消し自体が失敗することになったりします。
テーブルfilms
に対するpublicに与えた挿入権限を取り消します。
REVOKE INSERT ON films FROM PUBLIC;
ビューkinds
から、ユーザmanuel
に与えた全ての権限を取り消します。
REVOKE ALL PRIVILEGES ON kinds FROM manuel;
これは実際には「自分が与えた全ての権限を取り消す」ことを意味します。
ユーザjoe
からロールadmins
内のメンバ資格を取り消します。
REVOKE admins FROM joe;
GRANTコマンドの互換性についての注釈はREVOKE
にも同様に当てはまります。
標準では、キーワードRESTRICT
かCASCADE
のどちらかが必須です。
しかし、PostgreSQLではデフォルトでRESTRICT
とみなされます。