PostgreSQL學習----模式schema


PostgreSQL學習---模式schema

小序

 接觸PostgreSQL也有好長時間了,知識不總結梳理,似乎總不是自己的,繼續努力吧少年!以此記錄我的軟件工藝之路!

模式(Schema)

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

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

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

我們需要模式的原因有好多:

允許多個用戶使用一個數據庫而不會干擾其它用戶。

把數據庫對象組織成邏輯組,讓它們更便於管理。

第三方的應用可以放在不同的模式中, 這樣它們就不會和其它對象的名字沖突。

模式類似於操作系統層次的目錄,只不過模式不能嵌套。

創建一個schema

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

create schema demo_schema;

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

CREATE TABLE myschema.mytable (
...
);

刪除一個空的schema,如:

drop schema myschema;

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

drop schema myschema CASCADE;

pulic schema(public 模式)

在創建表時,如果沒有指定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模式的訪問 (或者一並刪除了它),因此,用戶就真的限制於他們自己的模式了。

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM