ロールから権限を削除する(REVOKE)
GRANT コマンドを使ってロールに追加された権限は REVOKE コマンドで削除することができます。ここでは PostgreSQL で REVOKE コマンドを使って権限を削除する方法について解説します。
(Last modified: )
REVOKEコマンドを使った権限の削除
REVOKE コマンドを使用することでロールに追加されている権限を削除することができます。目的ごとにいくつかの書式が用意されています。
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_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 { 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 DOMAIN domain_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 | PROCEDURE | ROUTINE } function_name [ ( [ [ argmode ] [ arg_name ] arg_type [, ...] ] ) ] [, ...] | ALL { FUNCTIONS | PROCEDURES | ROUTINES } 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 [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPE type_name [, ...] FROM { [ GROUP ] role_name | PUBLIC } [, ...] [ CASCADE | RESTRICT ]
色々ありますが、基本は下記の通りです。
REVOKE 権限 ON 対象 FROM 誰から
削除する権限の種類は GRANT コマンドと対応しています。詳しくは「ロールにテーブルやビューなどに対する権限を追加する(GRANT)」を参照されてください。
GRANT OPTION FOR をつけて REVOKE コマンドを実行した場合、権限を他のロールに与える権原だけが削除されます( GRANT コマンドで WITH GRANT OPTION によって追加された権限)。指定しなかった場合は、権限そのものと権限を他のロールに与える権原の両方が削除されます。
REVOKE コマンドでは最後に CASCADE か RESTRICT を指定することができます。自分に追加された権限と同じ権限を他のロールに追加していた場合、デフォルトの設定( RESTRICT )では自分に追加された権限の削除を行おうとすると失敗します。 CASCADE を指定していた場合には自分の権限と同時に自分が他のロールに追加した同じ権限もまとめて削除されます。
権限を他のロールから削除できるのは、対象のオブジェクトの所有者とスーパーユーザーです。それ以外のロールの場合は GRANT コマンドの WITH GRANT OPTION で他のロールに権限を追加する権限を追加されている場合に、他のロールに権限を追加していた場合にはその権限だけを削除することができます。
それではより具体的に使い方を見ていきます。
テーブルに対する権限を削除する
テーブルに対する権限を削除する場合を例として REVOKE コマンドの使い方を確認してみます。使用する書式は次のものです。
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 ]
例えば role_name ロールからテーブル table_name を対象として SELECT と INSERT の権限を削除するには次のように実行します。
REVOKE SELECT, INSERT ON table_name FROM role_name;
role_name ロールからテーブル table_name を対象として SELECT の権限を他のロールに追加する権限だけを削除するには次のように実行します。
REVOKE GRANT OPTION FOR SELECT ON table_name FROM role_name;
role_name ロールからテーブル table_name を対象として SELECT の権限を削除し、また role_name ロールが他のロールに追加した SELECT 権限も同時に削除するには次のように実行します。
REVOKE SELECT ON table_name FROM role_name CASCADE;
role_name ロールからテーブル table_name を対象として全ての権限を削除するには次のように実行します。
REVOKE ALL PRIVILEGES ON table_name FROM role_name;
-- --
それでは実際に試してみます。現在 public スキーマに staff テーブルが作成されており、 momo ロールに対して SELECT 、 INSERT 、 UPDATE の権限が追加されています。 psql メタコマンドの \dp を使用して確認してみます。
\dp
staff テーブルのアクセス権限のところに次のような値が設定されています。
postgres=arwdDxt/postgres+
momo=arw/postgres
値の見方は次の通りです。 momo ロールに対しては postgres ロールによって a(INSERT) r(SELECT) w(UPDATE) の権限が追加されているという意味になります。
rolename=xxxx -- ロールに与えられた権限 =xxxx -- PUBLICに与えられた権限 r -- SELECT(読み取り(read)) w -- UPDATE(書き込み(write)) a -- INSERT(追加(append)) d -- DELETE D -- TRUNCATE x -- REFERENCES t -- TRIGGER X -- EXECUTE U -- USAGE C -- CREATE c -- CONNECT T -- TEMPORARY arwdDxt -- すべての権限 (テーブル用。他のオブジェクトでは異なります。) * -- 直前の権限に関するグラントオプション /yyyy -- この権限を付与したロール
それでは momo ロールから staff テーブルに対する SELECT の権限を削除します。スーパーユーザーで接続したあと次のように実行してください。
revoke select on staff from momo;
SELECT 権限が削除されました。確認のためにあらためて \dp コマンドを実行してみます。
アクセス権限のところの値が momo=arw/postgres から momo=aw/postgres となり r(SELECT) が削除されているのが確認できます。
次に momo ロールから staff テーブルに対する全ての権限を削除します。スーパーユーザーで接続したあと次のように実行してください。
revoke all privileges on staff from momo;
残っていた INSERT と UPDATE の権限が削除されました。確認のためにあらためて \dp コマンドを実行してみます。
アクセス権限のところの値から momo に関する記述がすべて削除されました。
CASCADEを指定して権限を連鎖削除する
ロール A が自分に追加された権限を別の ロール B に追加していた場合、ロール A の権限を削除しようとすると失敗します。このような場合は REVOKE コマンドを実行する時に CASCADE を指定します。 CASCADE を指定した場合、ロール A の権限を削除すると同時にロール A がロール B に追加した権限も連鎖的に削除します。
それでは実際に試してみます。まず最初にスーパーユーザーで PostgreSQL に接続したあと、 momo ロールに対して public スキーマにあり staff テーブルを対象として SELECT 権限を追加します。この時 WITH GRANT OPTION をつけて他のロールに権限を追加できるようにします。
grant select on staff to momo with grant option;
次に momo ロールで PostgreSQL に接続したあと、 saru ロールに対して public スキーマにあり staff テーブルを対象として SELECT 権限を追加します。
grant select on staff to saru;
psql メタコマンドの \dp を使用してテーブルに対して追加されている権限を確認してみます。
\dp
staff テーブルのアクセス権限のところに次のような値が設定されています。
postgres=arwdDxt/postgres+
momo=r*/postgres +
saru=r/momo
momo ロールに対しては postgres ロールによって r(SELECT) *(グラントオプション) の権限が追加されており、 saru ロールに対しては momo ロールによって r(SELECT) の権限が追加されています。
この状態で momo ロールから staff テーブルに対する SELECT の権限を削除してみます。スーパーユーザーで接続したあと次のように実行してください。
revoke select on staff from momo;
すると ERROR: 依存する権限が存在します というエラーが発生し権限の削除に失敗しました。 momo ロールから削除しようとした権限について、 momo ロールが別のロールに権限を追加しているためです。
このような時は REVOKE コマンドに CASCADE を指定して実行します。スーパーユーザーで接続したあと次のように実行してください。
revoke select on staff from momo cascade;
今度は権限の削除に成功しました。確認のためにあらためて \dp コマンドを実行してみます。
アクセス権限のところの値から momo に追加していた権限が削除されると同時に saru に追加していた権限も削除されました。このように REVOKE コマンドを実行するときに CASCADE を指定することで、削除しようとする権限が他のロールに追加されていた場合でも、連鎖的に削除することができます。
-- --
REVOKE コマンドを使って権限を削除する方法について解説しました。
( Written by Tatsuo Ikura )
著者 / TATSUO IKURA
これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。