schema概念有點像命名空間或者把它想像成一個文件系統中的目錄,差別就是這個schema下不能再有schema嵌套.
各個對象比如表、函數等存放在各個schema下,同一個schema下不能有重複的對象名字,但在不同schema下可以重複.
使用schema的作用
- 方便管理多個用戶共享一個數據庫,但是又可以互相獨立.
- 方便管理衆多對象,更有邏輯性.
- 方便兼容某些第三方應用程序,創建對象時是有schema的.
比如要設計一個複雜系統.由衆多模塊構成,有時候模塊間又需要有獨立性.各模塊存放單獨的數據庫顯然是不合適的.
這時候使用schema來分類各模塊間的對象,再對用戶進行適當的權限控制.這樣邏輯也非常清晰.
創建schema
db01=# create schema schema01;
CREATE SCHEMA
db01=# \dn
List of schemas
Name | Owner
----------+----------
public | postgres
schema01 | postgres
(2 rows)
在schema中創建對象
db01=# create table schema01.t1(id int);
CREATE TABLE
db01=# insert into schema01.t1 values(1);
INSERT 0 1
db01=# select * from t1;
ERROR: relation "t1" does not exist
LINE 1: select * from t1;
^
db01=# select * from schema01.t1;
id
----
1
(1 row)
db01=# select * from db01.schema01.t1;
id
----
1
(1 row)
默認是在public這個schema下.因此要帶上schema名稱.數據庫名字如果要帶上,只能是當前連接的數據庫!!
刪除schema
db01=# drop schema schema01;
ERROR: cannot drop schema schema01 because other objects depend on it
DETAIL: table schema01.t1 depends on schema schema01
HINT: Use DROP ... CASCADE to drop the dependent objects too.
db01=# drop schema schema01 cascade;
NOTICE: drop cascades to table schema01.t1
DROP SCHEMA
schema下有對象如果需要一起刪除,需要帶上cascade關鍵字.有點像使用rmdir刪除目錄一樣,文件夾下有東西不然刪除.
創建schema指定owner
默認是誰創建的schema,owner就是誰,當然也可以指定
db01=# create schema s01 authorization hippo;
CREATE SCHEMA
db01=# create schema authorization hippo;
CREATE SCHEMA
db01=# \dn
List of schemas
Name | Owner
--------+----------
hippo | hippo
public | postgres
s01 | hippo
(3 rows)
指定了owner,不指定schema,則schema名字與owner一致。