
一個OushuDB資料庫叢集包含一個或多個已命名資料庫。 使用者和使用者組在整個叢集範圍内是共享的,但是其它資料并不共享。 任何與伺服器連接配接的客戶都隻能通路那個在連接配接請求裡聲明的資料庫。
Note
叢集中的使用者并不一定要有通路叢集内所有資料庫的權限。共享使用者名的意思是不能有重名使用者。 假定同一個叢集裡有兩個資料庫和一個joe使用者,系統可以配置成隻允許joe 通路其中的一個資料庫。
一個資料庫包含一個或多個已命名的模式,模式又包含表。模式還可以包含其它對象, 包括資料類型、函數、操作符等。同一個對象名可以在不同的模式裡使用而不會導緻沖突; 比如,schema1和myschema都可以包含一個名為mytable的表。 和資料庫不同,模式不是嚴格分離的:隻要有權限,一個使用者可以通路他所連接配接的資料庫中的任意模式中的對象。
我們需要模式的原因有很多:
● 允許多個使用者使用一個資料庫而不會幹擾其它使用者。
● 把資料庫對象組織成邏輯組,讓它們更便于管理。
● 第三方的應用可以放在不同的模式中,這樣它們就不會和其它對象的名字沖突。
模式類似于作業系統層次的目錄,隻不過模式不能嵌套。
1、建立模式
要建立一個模式,使用CREATE SCHEMA指令。給出你選擇的模式名字。比如:
CREATE SCHEMA myschema;
要建立或者通路在模式中的對象,寫出一個 受修飾 的名字,這個名字包含模式名以及表名, 它們之間用一個句點分開:
schema.table
這個方式在任何需要表名字的地方都可用,包括後面讨論的表修改指令和資料通路指令。出于簡化,我們将隻讨論表,這個概念适用于所有其它已命名對象類型,比如資料類型和函數。
實際上,更一般的文法:
database.schema.table
也可以使用,但目前它隻是為了和 SQL 标準 形式上 相容。如果你寫了一個資料庫名, 那麼它必須和你目前連接配接的資料庫同名。
要在新模式裡建立一個表,用:
CREATE TABLE myschema.mytable (...);
如果一個模式是空的(所有它裡面的對象都已經删除),那麼删除它的指令如下:
DROP SCHEMA myschema;
要删除一個模式及其包含的所有對象,可以使用:
DROP SCHEMA myschema CASCADE;
通常你想建立一個他人擁有的模式(因為這是一種限制使用者在定義良好的模式中的活動的方法)。其文法如下:
CREATE SCHEMA schemaname AUTHORIZATION username;
你甚至可以省略模式名字,這時模式名将和使用者名同名。參閱
http://www.oushu.com/docs/ch/schemas.html擷取這種情況的适用場合。
以pg_開頭的模式名是保留給系統使用的,使用者不能建立這樣的名字。
2、public模式
在前面的小節裡,我們沒有聲明任何模式名字就建立了表。預設時, 這樣的表(以及其它對象)都自動放到一個叫做”public”的模式中去了。 每個新資料庫都包含一個這樣的模式。是以,下面的指令是等效的:
CREATE TABLE products ( ... );
和:
CREATE TABLE public.products ( ... );
下面是系統預設建立的schema。
template1=# \dnList of schemasName | Owner--------------------+----------hawq_toolkit | ChangLeiinformation_schema | ChangLeipg_aoseg | ChangLeipg_bitmapindex | ChangLeipg_catalog | ChangLeipg_toast | ChangLeipublic | ChangLei(7 rows)