REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] table_name [, ...] | ALL TABLES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } ( column [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( column [, ...] ) } ON [ TABLE ] table_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE sequence_name [, ...] | ALL SEQUENCES IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE database_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER fdw_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER server_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION function_name ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) [, ...] | ALL FUNCTIONS IN SCHEMA schema_name [, ...] } FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE lang_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA schema_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE tablespace_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] role_name [, ...] FROM role_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を行わせたい特定のロールになることを推奨します。 こうしないと、意図しないロールによって権限を取り上げることになったり、取り上げ自体が失敗することになったりします。
publicに与えたfilmsテーブルに対する挿入権限を取り消します。
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と仮定されます。