ロールがどのロールにメンバとして属しているのかの一覧を取得する

PostgreSQL ではロールのメンバ資格を別のロールに付与することができます。ここでは PostgreSQL でロールの一覧とロールがメンバとして属しているロールの一覧を表示する方法について解説します。

(Last modified: )

\duコマンドを使用する

最初に psql のメタコマンドを使ってロールの一覧を取得する方法です。次のように実行してください。

\du

\duコマンドを使用する(1)

改行されているので見にくいのですが、次のように表示されています。

ロール名属性所属グループ
adminログインできません{}
inu {admin}
neko継承なし{admin}
postgresスーパーユーザ, ロール作成可, DB作成可,レプリケーション可, RLS のバイパス{}

所属グループのところに現在ロールがメンバとなっているロールが表示されています。このように \du コマンドを実行することで、ロールがメンバとして属しているロールを取得することができます。

メンバ資格の一覧を取得する

ロールに付与されたメンバ資格の一覧はシステムカタログの一つである pg_auth_members から取得することができます。 pg_auth_members には次のようなカラムがあります。

名前参照先説明
roleidoidpg_authid.oidメンバを持っているロールのID
memberoidpg_authid.oidroleidのメンバであるロールのID
grantoroidpg_authid.oidこのメンバシップを与えたロールのID
admin_optionbool もしmemberがroleidのメンバシップを他に与えることができる場合は真

それでは pg_auth_members からデータを取得してみます。次のように実行してください。

select * from pg_auth_members;

メンバ資格の一覧を取得する(1)

roleid がメンバ資格を与えたロールの ID 、 member がメンバ資格を与えられたロールの ID 、 grantor がメンバ資格を与えたコマンドを実行したロールの ID、 admin_option はメンバ資格を与えられた時に WITH ADMIN OPTION が付いていれば TRUE となります。

それぞれのロールが ID で保存されているので、ロール名を格納している pg_authid からデータを取得して表示するように変更します。(いい SQL 文が思いつかなかったので少し見にくいものになっています)。

select
(select pg_authid.rolname as role_name from pg_authid where pg_authid.oid = pg_auth_members.roleid),
(select pg_authid.rolname as member_name from pg_authid where pg_authid.oid = pg_auth_members.member),
(select pg_authid.rolname as grantor_name from pg_authid where pg_authid.oid = pg_auth_members.grantor),
admin_option
from pg_auth_members;

メンバ資格の一覧を取得する(2)

admin ロールにメンバ資格を与えられているロールが 2 つあり、 kuma ロールは postgres ロールによってメンバ資格を与えられており、 cat ロールは kuma ロールによってメンバ資格を与えられています。また kuma ロールは WITH ADMIN OPTION 付きです。

-- --

ロールの一覧とロールがメンバとして属しているロールの一覧を表示する方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。