PostgreSQL【模式Schema】

一個數據庫包含一個或多個命名的模式,模式又包含表。模式還包含其它命名的對象,包括數據類型、函數,以及操做符。同一個對象名能夠在不一樣的模式裏使用而 不會致使衝突; 好比,schema1和myschema均可以包含叫作mytable的表。和數據庫不一樣,模式不是嚴格分離的:一個用戶能夠訪問他所鏈接的數據庫中的任 意模式中的對象,只要他有權限。
    咱們須要模式有如下幾個主要緣由:
    1). 容許多個用戶使用一個數據庫而不會干擾其它用戶。
    2). 把數據庫對象組織成邏輯組,讓它們更便於管理。
    3). 第三方的應用能夠放在不一樣的模式中,這樣它們就不會和其它對象的名字衝突。
    
     1. 建立模式:
     CREATE SCHEMA myschema;
    經過以上命令能夠建立名字爲myschema的模式,在該模式被建立後,其即可擁有本身的一組邏輯對象,如表、視圖和函數等。
    
     2. public模式:
    在介紹後面的內容以前,這裏咱們須要先解釋一下public模式。每當咱們建立一個新的數據庫時,PostgreSQL都會爲咱們自動建立該模式。當登陸到該數據庫時,若是沒有特殊的指定,咱們將以該模式(public)的形式操做各類數據對象,如:
     CREATE TABLE products ( ... ) 等同於 CREATE TABLE public.products ( ... )
    
     3. 權限:
    缺省時,用戶看不到模式中不屬於他們全部的對象。爲了讓他們看得見,模式的全部者須要在模式上賦予USAGE權限。爲了讓用戶使用模式中的對象,咱們可能須要賦予額外的權限,只要是適合該對象的。PostgreSQL根據不一樣的對象提供了不一樣的權限類型,如:
    GRANT ALL ON SCHEMA myschema TO public;
    上面的ALL關鍵字將包含 CREATEUSAGE兩種權限。若是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. 模式搜索路徑:
    咱們在使用一個數據庫對象時可使用它的全稱來定位對象,然而這樣作每每也是很是繁瑣的,每次都不得不鍵入 owner_name.object_name。PostgreSQL中提供了模式搜索路徑,這有些相似於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一種模式。
相關文章
相關標籤/搜索