37. PostgreSQL 綱要¶
生產資料庫不可避免地會擁有大量的表格和檢視表,將它們全部放在一個綱要中管理很快就會變得難以處理。幸好,PostgreSQL 包含了「綱要」的概念。
綱要就像資料夾,可以包含表格、檢視表、函式、序列和其他關係。每個資料庫都從一個綱要開始,也就是 public
綱要。

在這個綱要中,PostGIS 的預設安裝會建立 geometry_columns
、geography_columns
和 spatial_ref_sys
元數據關係,以及 PostGIS 使用的所有類型和函式。因此,PostGIS 的使用者始終需要存取 public 綱要。
在 public 綱要中,您還可以查看我們在研討會中到目前為止建立的所有表格。
37.1. 為何使用綱要?¶
使用綱要有兩個非常好的理由
在綱要中管理的資料更容易套用大量操作。
備份位於獨立綱要中的資料更容易:因此,不穩定的資料可以擁有與非不穩定資料不同的備份排程。
還原位於獨立綱要中的資料更容易:因此,以應用程式為導向的綱要可以針對時間旅行和復原分別還原和備份。
當應用程式資料位於綱要中時,更容易管理應用程式差異:因此,新版本的軟體可以在新綱要中處理表格結構,而切換只涉及簡單地變更綱要名稱。
可以限制使用者在單個綱要中工作,以將分析和測試表格與生產表格隔離。
因此,對於生產目的,將您的應用程式資料分開放在綱要中有助於管理;而對於使用者目的,將您的使用者分開放在不同的綱要中可以防止他們互相干擾。
37.2. 建立資料綱要¶
讓我們建立一個新的綱要並將一個表格移入其中。首先,在資料庫中建立一個新的綱要
CREATE SCHEMA census;
接下來,我們會將 nyc_census_blocks
表格移至 census
綱要
ALTER TABLE nyc_census_blocks SET SCHEMA census;
如果您使用 psql 命令列程式,您會注意到 nyc_census_blocks
現在已從您的表格清單中消失!如果您使用 PgAdmin,您可能需要重新整理檢視以查看新的綱要及其中的表格。
您可以使用兩種方式存取綱要中的表格
使用
綱要.表格
標記法參考它們將綱要新增至您的
search_path
顯式參考很容易,但過了一段時間後輸入會變得乏味
SELECT * FROM census.nyc_census_blocks LIMIT 1;
操作 search_path
是一種很好的方式,可以在不需大量額外輸入的情況下提供對多個綱要中表格的存取權。
您可以使用 SET
命令在執行時間設定 search_path
SET search_path = census, public;
這可確保在 census
和 public
綱要中搜尋對關係和函式的所有參考。請記住,所有 PostGIS 函式和類型都在 public
中,因此我們不希望將其從搜尋路徑中刪除。
每次連線時都設定搜尋路徑也可能會變得乏味,但幸好可以永久設定使用者的搜尋路徑
ALTER USER postgres SET search_path = census, public;
現在,postgres 使用者的搜尋路徑中始終會有 census
綱要。
37.3. 建立使用者綱要¶
使用者喜歡建立表格,而 PostGIS 使用者尤其如此:使用 SQL 進行的分析操作需要用於視覺化或中期結果的暫時表格,因此空間 SQL 通常比一般資料庫工作負載更需要使用者擁有 CREATE 權限。
預設情況下,Oracle 中的每個角色都會獲得個人綱要。對於 PostgreSQL 使用者來說,這也是一種很好的做法,並且可以使用 PostgreSQL 角色、綱要和搜尋路徑輕鬆複製。
建立一個具有表格建立權限的新使用者 (有關 postgis_writer
角色的資訊,請參閱PostgreSQL 安全性),然後建立一個以該使用者為授權的綱要
CREATE USER myuser WITH ROLE postgis_writer;
CREATE SCHEMA myuser AUTHORIZATION myuser;
如果您以該使用者身分登入,您會發現 PostgreSQL 的預設 search_path
實際上是這樣
show search_path;
search_path
----------------
"$user",public
搜尋路徑中的第一個綱要是使用者命名的綱要!因此,現在存在以下條件
使用者存在,並且具有建立空間表格的能力。
使用者命名的綱要存在,並且使用者擁有它。
使用者的搜尋路徑首先具有使用者綱要,因此新的表格會自動建立在此處,且查詢也會自動首先在此處搜尋。
就是這樣,使用者預設的工作區域現在已與其他綱要中的任何表格完美分離。