PostgreSQL8でpostgresユーザ以外のユーザにcreatedbを実行させる方法
postgresユーザ以外のユーザにcreatedbを実行させようとした場合、role(ロール)の設定を行っていないとエラーになり、createdbに失敗する。成功させるには、role(ロール)の設定を行えばよい。
《例》
# /usr/local/postgresql8/bin/createdb -U nobuneko -E EUC_JP neko_database
FATAL: role "nobuneko" does not exist
createdb: could not connect to database postgres: FATAL: role "nobuneko" does not exist
postgresユーザでpsqlを使用し、role(ロール)の設定状況を確認することにする。
# /usr/local/postgresql8/bin/psql -U postgres
Welcome to psql 8.3.14, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# select rolname from pg_roles;
rolname
----------
postgres
(1 row)
現在、role(ロール)が存在するのはpostgresのみであることが確認できたので、新しくロールを作成することにする。
postgres=# create role nobuneko;
CREATE ROLE
createdbを実行。...しかし、これでは失敗する。
# /usr/local/postgresql8/bin/createdb -U nobuneko -E EUC_JP neko_database
FATAL: role "nobuneko" is not permitted to log in
createdb: could not connect to database postgres: FATAL: role "nobuneko" is not permitted to log in
エラーメッセージが変わった。
「role "nobuneko" is not permitted to log in」というエラーメッセージより、role「nobuneko」がデータベースにログインすることが許可されていないために、createdbが使用できないことが分かる。
そこで、role「nobuneko」にログインの権限を与えることにする。
postgres=# alter role nobuneko login;
ALTER ROLE
createdbを実行。...しかし、これでは失敗する。
# /usr/local/postgresql8/bin/createdb -U nobuneko -E EUC_JP neko_database
ERROR: permission denied to create database
STATEMENT: CREATE DATABASE neko_database ENCODING 'EUC_JP';
createdb: database creation failed: ERROR: permission denied to create database
エラーメッセージが変わった。
データベースにはログインできるようになったが、データベース作成の権限がないからcreatedbに失敗するようだ。
そこで、role「nobuneko」にcreatedbの権限を与えることにする。
postgres=# alter role nobuneko createdb;
ALTER ROLE
createdbを実行。
# /usr/local/postgresql8/bin/createdb -U nobuneko -E EUC_JP neko_database
# /usr/local/postgresql8/bin/psql -U postgres
Welcome to psql 8.3.14, the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
postgres=# \l
List of databases
Name | Owner | Encoding
---------------+----------+----------
neko_database | nobuneko | EUC_JP
postgres | postgres | EUC_JP
template0 | postgres | EUC_JP
template1 | postgres | EUC_JP
(4 rows)
postgres=#
データベース一覧を見ると、データベースを新しく作成することに成功したことが分かる。
postgresユーザ以外のユーザにcreatedbを実行させるには、少なくとも以下の作業が必要になるということが分かった。
(1)ロールを作成する
postgres=# create role nobuneko;
CREATE ROLE
(2)ロールにログイン権限を付与する
postgres=# alter role nobuneko login;
ALTER ROLE
(3)ロールにcreatedbの権限を付与する
postgres=# alter role nobuneko createdb;
ALTER ROLE