PostgreSQLスキルアップノート(自己啓発のための個人サイト)
スキーマの作成
【一覧に戻る】
マニュアルへのリンクは/9.2/としています。
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■■■■ PostgreSQL スキルアップノート
■■■■
■◆■■ スキーマの作成
■■■■
■■■■
■■■■ 2013/01/27
■■■■ 使用環境:PostgreSQL9.1.7 (CentOS6.2)
(C) 2013 ohdb
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
スキーマはオブジェクトの入れ物。
【マニュアル】
スキーマ→●[マニュアル]
CREATE SCHEMA→●[マニュアル]
■1■ スキーマの作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
CREATE SCHEMA文を使用してスキーマを作成する。
ユーザはデータベースの外に作成される(データベースクラスタ共通)のに対して、
スキーマはデータベースの中に個々に作成される点に注意。
基本形
・CREATE SCHEMA schema_name;
AUTHORIZATION句使用
特定のユーザ用にスキーマを用意してやる場合は「AUTHORIZATION句」を付ける。
・方法1 CREATE SCHEMA schema_name AUTHORIZATION user_name;
・方法2 CREATE SCHEMA AUTHORIZATION user_name;
以上合計3種類のパターンのうち、差支えなければAUTHORIZATION句の「方法2」が扱いやすい。
その他参考
マニュアル記載の schema_element 句はスキーマとセットでオブジェクト作成も一緒に
行うためのもの。(詳細略)
■2■ AUTHORIZATION なしでスキーマを作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 psql database1 dba01 (=psql -d database1 -U dba01)
【□】 CREATE SCHEMA scm01;
【□】 \dn+ scm01
スキーマ一覧
名前 | 所有者 | アクセス権 | 説明
--------+----------+----------------------+------------------------
scm01 | dba01 | |
スキーマ内でuser01,user02にCREATEなどをさせたい場合
【□】 GRANT ALL ON SCHEMA scm01 TO user01,user02;
【□】 \c - user01; (現在のDBにuser01として接続しなおす)
【□】 CREATE TABLE scm01.t1 (c1 text);
【□】 \c - user02;
【□】 CREATE TABLE scm01.t2 (c1 text);
スキーマの確認
【□】 \dn+ scm01
スキーマ一覧
名前 | 所有者 | アクセス権 | 説明
-------+--------+-----------------+------
scm01 | dba01 | dba01=UC/dba01 +|
| | user01=UC/dba01+|
| | user02=UC/dba01 |
スキーマ内のテーブルの確認
【□】 \dt scm01.*
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+--------
scm01 | t1 | テーブル | user01
scm01 | t2 | テーブル | user02
★管理上わかりづらい
・スキーマscm01の所有者はdba01
・スキーマscm01のt1テーブルの所有者はuser01
・スキーマscm01のt2テーブルの所有者はuser02
■3■ AUTHORIZATION ありでスキーマを作成
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
前項の例では、スキーマ名、その所有者、その中にできるテーブルの所有者がそれぞれ
異なっており管理上わかりづらい。
AUTHORIZATIONは指定したユーザを所有者にしたスキーマを用意することでその人向けの
スキーマを作成するのが目的。
自分が所有者なので前項のようにスキーマへの権限を与える必要はない。
方法1 CREATE SCHEMA schema_name AUTHORIZATION user_name;
方法2 CREATE SCHEMA AUTHORIZATION user_name;
特に方法2を使用すればスキーマ名と所有者がすべて一致するので誤解が生じない。
1.方法1の場合
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
【□】 psql database1 dba01 (=psql -d database1 -U dba01)
【□】 CREATE SCHEMA scm_for_user1 AUTHORIZATION user01;
user01によりscm_for_user1の中にテーブルt1を作成。
【□】 \c - user01
【□】 CREATE TABLE scm_for_user1.t11(c1 TEXT);
確認
【□】 \dn+ scm_*
【□】 \dt scm_for_user1.*;
スキーマ一覧
名前 | 所有者 | アクセス権 | 説明
---------------+--------+-----------------+------
scm_for_user1 | user01 | |
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
---------------+------+----------+--------
scm_for_user1 | t11 | テーブル | user01
2.方法2の場合
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
schema_nameを指定しない方法にしてユーザ名と同じ名前のスキーマを作成。
【□】 psql database1 dba01
【□】 CREATE SCHEMA AUTHORIZATION user01;
user01によりuser01の中にテーブルt1を作成。
【□】 \c - user01
【□】 CREATE TABLE user01.t1(c1 TEXT);
確認
【□】 \dn+ user01
【□】 \dt user01.*;
スキーマ一覧
名前 | 所有者 | アクセス権 | 説明
--------+--------+------------+------
user01 | user01 | |
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+--------
user01 | t1 | テーブル | user01
★これでスキーマ名とスキーマ所有者、テーブルの所有者がすべてuser01となった。
■■ 個人用覚え
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
マニュアルに以下の記述あり
----マニュアル-----------
AUTHORIZATION句を使用した場合、作成された全てのオブジェクトの所有者が指定した
ユーザになるという点で異なっています。
-------------------------
ただ単純にスキーマの所有者が指定した名前になるというだけ。
中身のオブジェクトの所有者がどうこうなるという訳ではない。
またAUTHORIZATION句で作成したとしても別の人に権限を与えればそのスキーマ内に
所有者の異なるテーブルが作成されてしまうことになる。
AUTHORIZATION user01により作成したscm_for_user1の中に
user02がテーブルt22を作成してみる。(権限が必要)
【□】 \c - dba01;
【□】 CREATE SCHEMA AUTHORIZATION user03;
【□】 GRANT ALL ON SCHEMA user03 TO user01,user02;
【□】 \c - user01
【□】 CREATE TABLE user03.t11(c1 TEXT);
【□】 \c - user02
【□】 CREATE TABLE user03.t12(c1 TEXT);
【□】 \c - user03
【□】 CREATE TABLE user03.t13(c1 TEXT);
確認
【□】 \dn+ user03
【□】 \dt user03.*
スキーマ一覧
名前 | 所有者 | アクセス権 | 説明
--------+--------+------------------+------
user03 | user03 | user03=UC/user03+|
| | user01=UC/user03+|
| | user02=UC/user03 |
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+------+----------+--------
user03 | t11 | テーブル | user01
user03 | t12 | テーブル | user02
user03 | t13 | テーブル | user03
以上