Postgresql(schema)

模式(Schema)

一個 PostgreSQL數據庫集羣包含一個或多個命名的數據庫。用戶和用戶組在整個集羣的範圍內是共享的,但是其它數據並不是共享的。任何給定的與服務器的客戶連接都只能訪問在一個數據庫裏的數據,就是那個在連接請求裏聲明的。

注意: 一個集羣的用戶並不一定要有訪問集羣內所有數據庫的權限。共享用戶名的意思是不能有同名用戶,也就是,在同一個集羣裏的兩個數據庫裏都有叫 joe 的用戶;但是系統可以配置成 只允許 joe 訪問某些數據庫。

一個數據庫包含一個或多個命名的模式,模式又包含表。模式還包含其它命名的對象,包括數據類型,函數, 以及操作符。同一個對象名可以在不同的模式裏使用而不會導致衝突; 比如,schema1 和 myschema 都可以包含叫做 mytable 的表。和數據庫不同,模式不是嚴格分離的:一個用戶可以訪問他所連接的數據庫中的任意模式中的對象, 只要他有權限。

我們需要模式的原因有好多:
允許多個用戶使用一個數據庫而不會干擾其它用戶
把數據庫對象組織成邏輯組,讓它們更便於管理
第三方的應用可以放在不同的模式中, 這樣它們就不會和其它對象的名字衝突
模式類似於操作系統層次的目錄,只不過模式不能嵌套

由於Schema是一個純邏輯層面的概念,類似於“命名空間”的概念,可以基於不同的Schema對業務所需的數據庫對象進行SQL級別的權限歸類。優先考慮創建一個新的Database,而不是Schema的幾中情況:
a.對一組數據表的文字編碼/排序規則 的默認行爲進行定製時;
b.對一組數據庫表(或Function等數據庫對象)的併發數進行單獨控制時;
c.對一組數據庫表(或Function等數據庫對象)的訪問進行嚴格隔離。

創建模式

創建一個模式(schema)使用CREATE SCHEMA命令,如:

create schema demo_schema;

在指定模式裏創建表,如:

CREATE TABLE myschema.mytable (
...
);

刪除一個空的schema,如:

drop schema myschema;

刪除一個模式以及模式裏面所有的對象,如:

drop schema myschema CASCADE;

pulic schema

在創建表時,如果沒有指定schema,則表會自動被歸屬到一個叫做public的模式中,每一個數據庫中都會有一個這樣的模式。下面兩種創建表的方式是等效的:

CREATE TABLE tableName(...);

CREATE TABLE public.tableName(...);

模式和權限

缺省時,用戶看不到模式中不屬於他們所有的對象。爲了讓他們看得見,模式的所有者需要在模式上賦予 USAGE 權限。爲了讓用戶使用模式中的對象,我們可能需要賦予額外的權限, 只要是適合該對象的。
用戶也可以允許在別人的模式裏創建對象。要允許這麼做, 我們需要賦予在該模式上的 CREATE 權限。 請注意,缺省時,每個人都在 public 模式上 有 CREATE 權限。這樣就允許所有可以連接到 指定數據庫上的用戶在這裏創建對象。如果你不允許這麼做, 你可以撤銷這個權限:

REVOKE CREATE ON public FROM PUBLIC;

(第一個 "public" 是模式,第二個 "public" 意思是"所有用戶"。 第一句裏它是個標識符,而第二句裏是個關鍵字,所以有不同的大小寫)

模式搜索路徑

全稱的名字寫起來非常費勁,並且我們最好不要在應用裏直接 寫上特定的模式名。因此,表通常都是用未修飾的名字 引用的,這樣的名字裏只有表名字。系統通過查找一個搜索路徑 來判斷一個表究竟是哪個表,這個路徑是一個需要查找的模式列表。 在搜索路徑裏找到的第一個表將被當作選定的表。如果在搜索路徑中 沒有匹配表,那麼就報告一個錯誤,即使匹配表的名字在數據庫其它的 模式中存在也如此。

在搜索路徑中的第一個模式叫做當前模式。除了是搜索的第一個模式之外, 它還是在 CREATE TABLE 沒有聲明模式名的時候,新建表所在的地方。
查看當前搜索路徑,使用命令:

SHOW search_path;

在缺省的設置中,返回下面的東西:

 search_path
--------------
 $user,public

第一個元素聲明將要搜索一個和當前用戶同名的模式。 因爲還沒有這樣的模式存在,所以這條記錄被忽略。第二個元素指向public模式。

要把新的模式放到路徑中來,我們用:

SET search_path TO myschema,public;

使用方式

模式可以以多種方式組織你的數據。下面是一些建議使用的模式, 它們也很容易在缺省配置中得到支持:

如果你沒有創建任何模式,那麼所有用戶隱含都訪問public模式。 這樣就模擬了還沒有模式的時候的情景。這種設置建議主要用在 只有一個用戶或者數據庫裏只有幾個合作用戶的情形。這樣的設置 也允許我們平滑地從無模式的環境過渡。

你可以爲每個用戶創建一個模式,名字和用戶相同。要記得缺省的 搜索路徑從$user開始,它會解析爲用戶名。 因此,如果每個用戶都有一個獨立的模式,那麼他們缺省時訪問他們 自己的模式。

如果你使用了這樣的設置,那麼你可能還想撤銷對public模式的訪問 (或者一併刪除了它),因此,用戶就真的限制於他們自己的模式了。

要安裝共享的應用(被所有人使用的表,第三方提供的額外的函數等等),我們可以把它們放到獨立的模式中。只要記得給訪問它們的用戶賦予合適 的權限就可以了。然後用戶就可以通過用一個模式名修飾這些名字來使用這些額外的對象,或者他們可以把額外的模式放到他們的搜索路徑中,由他們定。

數據庫、模式和數據表之間的的關係
參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章