PostgreSQL

PostgreSQL スキーマ作成

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
;

スキーマ一覧

スポンサーリンク