create schema
スキーマはデータベース内に存在する名前空間なので、create schema文は現在接続しているデータベース内に作成します。authorization オプションを使った場合、そのスキーマに作成されるオブジェクトは authorization オプションで指定したユーザが所有者になります。参考までにですが、「pg_」で始まるスキーマ名を作成する事はできません。pg_始まりのプレフィクスはシステムスキーマ名として予約されています。
create schema udonman ;
-- スキーマ配下に作成されるオブジェクトの所有者はauthorizationで指定したユーザとなる create schema udonman authorization sooni ;
作成例
ユーザと同じスキーマを作成した場合、同時にカレントスキーマも変更します。
-- 事前にサーチパスを確認
-- (デフォルトの状態)
--
udondb=> show search_path;
search_path
-----------------
"$user", public
(1 行)
-- ユーザと同一名のスキーマを作成する前はログインした際のカレントスキーマは
-- publicになっています。
--
udondb=> select current_user,current_schema,current_database()
udondb-> ;
current_user | current_schema | current_database
--------------+----------------+------------------
udonman | public | udondb
(1 行)
-- ユーザと同じ名前のスキーマを作成する
--
udondb=> create schema udonman;
CREATE SCHEMA
-- 以下の通りスキーマ作成と同時にカレントスキーマも変更しています。
--
udondb=> select current_user,current_schema,current_database()
udondb-> ;
current_user | current_schema | current_database
--------------+----------------+------------------
udonman | udonman | udondb
(1 行)
udondb=>
ERROR: permission denied for database xxxx
スキーマ作成を試みるも「ERROR: permission denied for database xxxx」となって作成できない場合がありますが、おそらくスキーマを作成しようとしているデータベースにcreate権限を持っていないと思われます。
データベースへの権限を確認する
select d.datname,u.usename as owner ,pg_catalog.array_to_string(d.datacl, E'\n') AS "Access privileges" from pg_database d inner join pg_user u on d.datdba = u.usesysid left outer join pg_tablespace s on d.dattablespace = s.oid where d.datname='xxxxx';
対象データベースへのcreate権限を付与する
grant create on database xxxxx to udonman ;