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



以上 
inserted by FC2 system