PostgreSQL

オーナー指定のcreate databaseの際注意する事

must be member of role エラー発生

以下はsooniユーザが、udonmanユーザを作成しその後udonmanユーザをオーナーにするudondbデータベースを作成しようとしたタイミングで「must be member of role」エラーが発生した状況です。

これはudondbのオーナーをudonmanにしようとしているものの、udondbへのアクセス権限をudonmanが保持していないために発生するエラーです。(今回はsooniユーザでDBを作成しようとしているからです。)このエラーを回避するには2つの方法があります。

  1. エラーメッセージに従い、udonmanロール(ユーザ)をsooniユーザへ付与した後、再度create databaseを行う。
  2. 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=>
--
-- 今度はうまくいきました
--

ロールメンバーの確認方法

スポンサーリンク