must be member of role エラー発生
以下はsooniユーザが、udonmanユーザを作成しその後udonmanユーザをオーナーにするudondbデータベースを作成しようとしたタイミングで「must be member of role」エラーが発生した状況です。
これはudondbのオーナーをudonmanにしようとしているものの、udondbへのアクセス権限をudonmanが保持していないために発生するエラーです。(今回はsooniユーザでDBを作成しようとしているからです。)このエラーを回避するには2つの方法があります。
- エラーメッセージに従い、udonmanロール(ユーザ)をsooniユーザへ付与した後、再度create databaseを行う。
- sooniユーザにスーパーユーザ権限を付与(alter user sooni with SUPERUSER)してcreate databaseを行う。
must be member of role エラー発生の状況
-- sooniはロール作成権限、DB作成権限を持っています
--
postgres=> SELECT oid,rolname
postgres-> ,case rolsuper when 'true' then '〇' else '×' end as "super"
postgres-> ,case rolinherit when 'true' then '〇' else '×' end as "inherit"
postgres-> ,case rolcreaterole when 'true' then '〇' else '×' end as "createRole"
postgres-> ,case rolcreatedb when 'true' then '〇' else '×' end as "createDb"
postgres-> ,case rolcanlogin when 'true' then '〇' else '×' end as "canLogin"
postgres-> ,case rolreplication when 'true' then '〇' else '×' end as "replication"
postgres-> ,rolconnlimit as "connLimit"
postgres-> FROM pg_roles where rolcanlogin = true
postgres-> and rolname='sooni'
postgres-> ;
oid | rolname | super | inherit | createRole | createDb | canLogin | replication | connLimit
-------+---------+-------+---------+------------+----------+----------+-------------+-----------
16410 | sooni | × | 〇 | 〇 | 〇 | 〇 | × | -1
(1 行)
--
-- sooniでログインしています
postgres=> select current_user,current_schema,current_database();
current_user | current_schema | current_database
--------------+----------------+------------------
sooni | public | postgres
(1 行)
-- udonmanユーザを作成する
--
postgres=> create user udonman with password 'udonman';
CREATE ROLE
--
-- udonmanをオーナーにしたudondbデータベース作成を試みるも
-- エラー発生
postgres=> create database udondb with owner udonman;
ERROR: must be member of role "udonman"
postgres=>
対策1 udonmanをsooniのメンバーシップにする
-- エラーが発生
--
postgres=> create database udondb with owner udonman;
ERROR: must be member of role "udonman"
--
-- udonmanロール(ユーザ)をsooniユーザへ付与する
--
postgres=> grant udonman to sooni;
GRANT ROLE
--
-- 再度実行すると今度はうまくいきました
--
postgres=> create database udondb with owner udonman;
CREATE DATABASE
postgres=>
対策2 sooniユーザにスーパーユーザ権限を付与する
以下をスーパーユーザ(postgres)にて実行する
postgres=# SELECT oid,rolname
postgres-# ,case rolsuper when 'true' then '〇' else '×' end as "super"
postgres-# ,case rolinherit when 'true' then '〇' else '×' end as "inherit"
postgres-# ,case rolcreaterole when 'true' then '〇' else '×' end as "createRole"
postgres-# ,case rolcreatedb when 'true' then '〇' else '×' end as "createDb"
postgres-# ,case rolcanlogin when 'true' then '〇' else '×' end as "canLogin"
postgres-# ,case rolreplication when 'true' then '〇' else '×' end as "replication"
postgres-# ,rolconnlimit as "connLimit"
postgres-# FROM pg_roles where rolcanlogin = true order by oid
postgres-# ;
oid | rolname | super | inherit | createRole | createDb | canLogin | replication | connLimit
-------+----------+-------+---------+------------+----------+----------+-------------+-----------
10 | postgres | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | -1
16410 | sooni | × | 〇 | 〇 | 〇 | 〇 | × | -1
16461 | udonman | × | 〇 | × | × | 〇 | × | -1
(3 行)
--
-- sooniユーザにスーパーユーザ権限を付与
--
postgres=# alter user sooni with SUPERUSER;
ALTER ROLE
--
-- 権限付与できた事確認できました
--
oid | rolname | super | inherit | createRole | createDb | canLogin | replication | connLimit
-------+----------+-------+---------+------------+----------+----------+-------------+-----------
10 | postgres | 〇 | 〇 | 〇 | 〇 | 〇 | 〇 | -1
16410 | sooni | 〇 | 〇 | 〇 | 〇 | 〇 | × | -1
16461 | udonman | × | 〇 | × | × | 〇 | × | -1
(3 行)
postgres=#
以下はsooniユーザでのオペレーション
postgres=> create user udonman;
CREATE ROLE
postgres=> create database udondb with owner udonman;
ERROR: must be member of role "udonman"
postgres=>
-- ここのタイミングで、postgresユーザにてsooniユーザへスーパーユーザ権限を
-- 付与し、再度create文を実行する
--
postgres=> create database udondb with owner udonman;
CREATE DATABASE
postgres=>
--
-- 今度はうまくいきました
--