PostgreSQL | ロール(ユーザー) ROLE 作成 | ロール権限の削除(REVOKE)

GRANT コマンドを使用してロールに追加した権限は、REVOKE コマンドで削除できる。ここでは REVOKE コマンドを使用して権限を削除する方法について説明する。

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 スキーマに memo テーブルが作成され、mykuma ロールに SELECT、INSERT、UPDATE 権限が追加されている。psql メタコマンド \dp を使用して確認してみる。

devkuma=# \dp
                                액세스 권한
 스키마 | 이름 |  종류  |        액세스 권한        | 칼럼 접근권한 | 정책
--------+------+--------+---------------------------+---------------+------
 public | memo | 테이블 | postgres=arwdDxt/postgres+|               |
        |      |        | mykuma=arw/postgres       |               |
(1개 행)


devkuma=#

上のアクセス権限は GRANT SELECT,INSERT,UPDATE ON memo TO mykuma; によって追加された権限である。

memo テーブルのアクセス権限には次の値が設定されている。

postgres=arwdDxt/postgres
mykuma=arw/postgres

値の意味は次のとおりである。mykuma ロールについては、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 -- この権限を付与したロール

では、mykuma ロールから memo テーブルへの SELECT 権限を削除する。スーパーユーザーで接続し、次のように実行する。

devkuma=# revoke select on memo from mykuma;
REVOKE
devkuma=#

SELECT 権限が削除された。確認のため、もう一度 \dp コマンドを実行する。

devkuma=# \dp
                                액세스 권한
 스키마 | 이름 |  종류  |        액세스 권한        | 칼럼 접근권한 | 정책
--------+------+--------+---------------------------+---------------+------
 public | memo | 테이블 | postgres=arwdDxt/postgres+|               |
        |      |        | mykuma=aw/postgres        |               |
(1개 행)


devkuma=#

アクセス権限の値が mykuma=arw/postgres から mykuma=aw/postgres に変わり、r (SELECT) が削除されたことを確認できる。

次に、mykuma ロールから memo テーブルへのすべての権限を削除してみる。スーパーユーザーで接続した後、次のように実行する。

devkuma=# revoke all privileges on memo from mykuma;
REVOKE
devkuma=#

残っていた INSERT および UPDATE 権限も削除された。確認のため、もう一度 \dp コマンドを実行する。

devkuma=# \dp
                                액세스 권한
 스키마 | 이름 |  종류  |        액세스 권한        | 칼럼 접근권한 | 정책
--------+------+--------+---------------------------+---------------+------
 public | memo | 테이블 | postgres=arwdDxt/postgres |               |
(1개 행)


devkuma=#

アクセス権限から mykuma ロール自体がすべて削除された。

CASCADE を指定して権限をまとめて削除する

ロール A が自分に追加された権限を別のロール B に追加した場合、ロール A の権限を削除しようとすると失敗する。このような場合は、REVOKE コマンド実行時に CASCADE を指定する。CASCADE を指定すると、ロール A の権限を削除すると同時に、ロール A がロール B に追加した権限も連鎖的に削除される。

それでは実際に試してみる。まずスーパーユーザーで PostgreSQL に接続し、mykuma ロールに public スキーマの memo テーブルを対象として SELECT 権限を追加する。このとき WITH GRANT OPTION を追加し、他のロールにも権限を追加できるようにする。

devkuma=# grant select on memo to mykuma with grant option;
GRANT
devkuma=#

次に mykuma ロールで PostgreSQL に接続し、superkuma ロールに public スキーマの memo テーブルを対象として SELECT 権限を追加する。

C:\Users\kimkc>psql -U mykuma -d devkuma
mykuma 사용자의 암호:
psql (12.2)
도움말을 보려면 "help"를 입력하십시오.

devkuma=> grant select on memo to superkuma;
GRANT
devkuma=>

psql メタコマンド \dp を使用して、テーブルに追加された権限を確認する。

devkuma=> \dp
                                액세스 권한
 스키마 | 이름 |  종류  |        액세스 권한        | 칼럼 접근권한 | 정책
--------+------+--------+---------------------------+---------------+------
 public | memo | 테이블 | postgres=arwdDxt/postgres+|               |
        |      |        | mykuma=r*/postgres       +|               |
        |      |        | superkuma=r/mykuma        |               |
(1개 행)


devkuma=>

memo テーブルのアクセス権限には次の値が設定されている。

postgres=arwdDxt/postgres+
mykuma=r*/postgres       +
superkuma=r/mykuma

mykuma ロールについては postgres ロールにより r (SELECT) と * (グラントオプション) の権限が追加されており、superkuma ロールについては mykuma ロールにより r (SELECT) の権限が追加されている。

この状態で、mykuma ロールから memo テーブルへの SELECT 権限を削除しようとする。スーパーユーザーで接続し、次のように実行する。

devkuma=# revoke select on memo from mykuma;
오류:  ???의존(적인) 권한이 존재합니다
힌트:  그것들을 취소하려면 "CASCADE"를 사용하세요.
devkuma=#

すると「오류: ???의존(적인) 권한이 존재합니다」というエラーが発生し、権限の削除に失敗した。mykuma ロールから削除しようとしている権限について、mykuma ロールが別のロールにも権限を追加していたためである。

このような場合は、REVOKE コマンドに CASCADE を指定して実行する。スーパーユーザーで接続し、次のように実行する。

devkuma=# revoke select on memo from mykuma cascade;
REVOKE
devkuma=#

今回は権限の削除に成功した。確認のため、もう一度 \dp コマンドを実行する。

devkuma=# \dp
                                액세스 권한
 스키마 | 이름 |  종류  |        액세스 권한        | 칼럼 접근권한 | 정책
--------+------+--------+---------------------------+---------------+------
 public | memo | 테이블 | postgres=arwdDxt/postgres |               |
(1개 행)


devkuma=#

アクセス権限の値から、mykuma に追加した権限が削除され、さらに superkuma に追加した権限も削除されている。このように REVOKE コマンド実行時に CASCADE を指定すると、削除しようとする権限が別のロールに追加されている場合でも、連鎖的に削除できる。

ここまで、REVOKE コマンドを使用して権限を削除する方法について説明した。