### [PostgreSQL學習手冊(模式Schema)](http://www.cnblogs.com/stephen-liu74/archive/2012/04/25/2291526.html)
Posted on?2012-04-25 08:18?[Stephen_Liu](http://www.cnblogs.com/stephen-liu74/)?閱讀(1827) 評論(1)?[編輯](http://www.cnblogs.com/stephen-liu74/admin/EditPosts.aspx?postid=2291526)?[收藏](http://www.cnblogs.com/stephen-liu74/archive/2012/04/25/2291526.html#)?
??? 一個數據庫包含一個或多個命名的模式,模式又包含表。模式還包含其它命名的對象,包括數據類型、函數,以及操作符。同一個對象名可以在不同的模式里使用而不會導致沖突; 比如,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關鍵字將包含**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. 模式搜索路徑:
?? ?我們在使用一個數據庫對象時可以使用它的全稱來定位對象,然而這樣做往往也是非常繁瑣的,每次都不得不鍵入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一種模式。*
分類:?[PostgreSQL](http://www.cnblogs.com/stephen-liu74/category/343171.html)
- 數據表
- 模式Schema
- 表的繼承和分區
- 常用數據類型
- 函數和操作符-一
- 函數和操作符-二
- 函數和操作符-三
- 索引
- 事物隔離
- 性能提升技巧
- 服務器配置
- 角色和權限
- 數據庫管理
- 數據庫維護
- 系統表
- 系統視圖
- SQL語言函數
- PL-pgSQL過程語言
- PostgreSQL 序列(SEQUENCE)
- PostgreSQL的時間-日期函數使用
- PostgreSQL 查看數據庫,索引,表,表空間大小
- 用以查詢某表的詳細 包含表字段的注釋信息
- PostgreSQL 系統表查看系統信息
- postgre存儲過程簡單實用方法
- PostgreSQL實用日常維護SQL
- PostgreSQL的時間函數使用整理
- 命令
- pg_ctl控制服務器
- initdb 初始化數據庫簇
- createdb創建數據庫
- dropdb 刪除數據庫
- createuser創建用戶
- dropuser 刪除用戶
- psql交互式工具
- psql命令手冊
- pg_dump 數據庫轉儲
- pg_restore恢復數據庫
- vacuumdb 清理優化數據庫
- reindexdb 數據庫重創索引
- createlang 安裝過程語言
- droplang 刪除過程語言
- pg_upgrade 升級數據庫簇
- 調試存儲過程
- 客戶端命令-一
- 客戶端命令-二
- 使用技巧
- PostgreSQL刪除重復數據
- postgresql 小技巧
- PostgreSQL的10進制與16進制互轉
- PostgreSQL的漢字轉拼音
- Postgres重復數據的更新一例
- PostgreSQL使用with一例
- PostgreSQL在函數內返回returning
- PostgreSQL中的group_concat使用
- PostgreSQL數據庫切割和組合字段函數
- postgresql重復數據的刪除
- PostgreSQL的遞歸查詢(with recursive)
- PostgreSQL函數如何返回數據集
- PostgreSQL分區表(Table Partitioning)應用 - David_Tang - 博客園
- PostgreSQL: function 返回結果集多列和單列的例子
- 利用pgAgent創建定時任務
- 淺談 PostgreSQL 類型轉換類似Oracle
- postgresql在windows(包括win7)下的安裝配置
- PostgreSQL簡介、安裝、用戶管理、啟動關閉、創建刪除數據庫 (2010-11-08 12-52-51)轉載▼標簽: 雜談分類: PostgreSQL
- PostgreSQL的generate_series函數應用
- PostgreSQL 8.3.1 全文檢索(Full Text Search)
- postgresql record 使用
- 備份恢復
- PostgreSQL基于時間點恢復(PITR)
- Postgresql基于時間點恢復PITR案例(二)
- Postgres邏輯備份腳本
- Postgres invalid command \N數據恢復處理