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 コマンドを使用して権限を削除する方法について説明した。