PostgreSQL教程(二):モードSchema詳細


一つのデータベースには一つ以上の名前付きパターンが含まれています。モードはテーブルも含まれています。モードはまた、データの種類、関数、およびオペレータを含む他の名前のオブジェクトを含んでいます。同じオブジェクト名は、衝突の原因ではなく、異なるモードで使用できます。例えば、schema 1とmyschemaはmytableという表を含んでいます。データベースと違って、モードは厳密に分離されていません。一人のユーザは彼が接続したデータベースの中の任意のモードのオブジェクトにアクセスできます。彼が権限を持っている限り。
    私たちはモデルが必要です。次のいくつかの要因があります。
    1)複数のユーザが他のユーザと干渉しないように一つのデータベースを使用できるようにする。
    2)データベースオブジェクトを論理グループに組織し、より管理しやすくする。
    3)サードパーティのアプリケーションは、他のオブジェクトの名前と競合しないように異なるモードに置くことができます。
    
    1.作成モード:
 

    CREATE SCHEMA myschema;
 
    以上のコマンドでmysschemaという名前のモードを作成できます。このモードが作成された後、テーブル、ビュー、関数などの論理オブジェクトのセットを持つことができます。
    
    2.publicモード:
    後の内容を紹介する前に、ここではまずpublicモードを説明します。新しいデータベースを作成するたびに、PostgreSQLは私たちのために自動的にモードを作成します。このデータベースに登録すると、特別な指定がない場合、このモードで各種データオブジェクトを操作します。
 

    CREATE TABLE products ( ... ) CREATE TABLE public.products ( ... )
   
    3.パーミッション:
    デフォルトの時、ユーザーはモードの中で彼らのすべての対象に属さないことが見えません。彼らが見えるように、モデルの所有者はモード上でUSAGE権限を与える必要があります。モード中のオブジェクトをユーザに使用させるためには、オブジェクトに適合するものであれば、追加の権限を与える必要があります。PostgreSQLは、異なるオブジェクトによって異なる権限タイプを提供する。
 

    GRANT ALL ON SCHEMA myschema TO public;
 
    上のALLキーワードにはCREATEとUSAGEの二つの権限が含まれます。publicモードがmyschemaモードのCREATE権限を持っている場合、このモードに登録されたユーザは、myschemaモードにおいて任意のオブジェクトを作成することができる。
 

    CREATE TABLE myschema.products (
        product_no integer,
        name text,
        price numeric CHECK (price > 0),
    );
 
    モードのすべてのテーブルに権限を与えるには、権限を様々な異なるテーブル動作に分割する必要があります。
 

    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT INSERT, SELECT, UPDATE, DELETE, TRUNCATE, REFERENCES, TRIGGER ON TABLES TO public;
 
    モードにおけるすべてのSequenceシーケンスオブジェクトに権限を与えるには、権限を様々なSequence動作に分割する必要があります。
 

    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT SELECT, UPDATE, USAGE ON SEQUENCES TO public;
 
    モードのすべての関数に権限を与える場合、実行権限のみを考慮します。
 

    ALTER DEFAULT PRIVILEGES IN SCHEMA myschema
    GRANT EXECUTE ON FUNCTIONS TO public;
 
    以上のようにpublicモードでmyschemaモードのために様々なオブジェクトを作成するのは極めて不便であることが分かります。もう一つの方法を紹介します。つまり、roleオブジェクトを通じて直接にmyschemaオブジェクトに登録して、その後myschemaモードで直接に必要なオブジェクトを作成することができます。
   

    CREATE ROLE myschema LOGIN PASSWORD '123456'; -- 。
    CREATE SCHEMA myschema AUTHORIZATION myschema; -- , 。
 
    Linux Shellでは、myschemaのキャラクターでデータベースMyTestに登録し、パスワード入力が正しいとデータベースに登録されます。
 

    /> psql -d MyTest -U myschema
    Password:
    MyTest=> CREATE TABLE test(i integer);
    CREATE TABLE
    MyTest=> \d   -- , tables 。
              List of relations
     Schema     |   Name   | Type  |  Owner
    ------------+---------+------+----------
     myschema |   test     | table  | myschema
    (1 rows)
   
    4.削除モード:
 

    DROP SCHEMA myschema;
 
    モードとそのすべてのオブジェクトを削除するには、カスケードを使って削除します。
 

    DROP SCHEMA myschema CASCADE;
 
    
    5.モード検索パス:
    私たちはデータベースオブジェクトを使用する時、そのフルネームを使ってオブジェクトを特定することができますが、このようにすると非常にややこしいことも多く、毎回ワーナーを入力しなければなりません。name.object_namePostgreSQLでは、LinuxのPATH環境変数のようなモード検索パスが提供されています。Shellコマンドを実行すると、コマンドはPATHのディレクトリリストにあります。コマンド名で直接実行できます。そうでなければ、フルパス名を入力する必要があります。PostgreSQLも同様に検索パスを検索することによって、テーブルがどのテーブルなのかを判断します。このパスは検索が必要なモードリストです。検索パスで見つけた最初のテーブルを選択したテーブルとして使用します。検索パスにマッチテーブルがない場合は、マッチングテーブルの名前がデータベースの他のモードに存在していてもエラーが報告されます。
    検索パスの最初のモードを現在のモードといいます。検索の最初のパターンに加えて、CREATE TABLEがモード名を宣言していないとき、新しいテーブルが属するパターンです。現在の検索パスを表示するには、次のコマンドを使います。
 

    MyTest=> SHOW search_path;
      search_path
    ----------------
     "$user",public
    (1 row)
 
    新しいモードを検索パスに追加できます。
 

    SET search_path TO myschema,public;
 
    検索パスに指定されたモードを設定します。
 

    SET search_path TO myschema; -- myschema 。