支援的版本:目前 (17) / 16 / 15 / 14 / 13
開發版本:devel
不支援的版本:12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2 / 8.1 / 8.0 / 7.4 / 7.3

22.3. 範本資料庫 #

CREATE DATABASE 實際上是透過複製現有的資料庫來運作。預設情況下,它會複製名為 template1 的標準系統資料庫。 因此,該資料庫是建立新資料庫的範本。如果您將物件新增至 template1,這些物件將被複製到後續建立的使用者資料庫中。此行為允許對資料庫中的標準物件集進行站台本地修改。例如,如果您在 template1 中安裝程序語言 PL/Perl,它將自動在使用者資料庫中可用,而無需在建立這些資料庫時採取任何額外動作。

然而,CREATE DATABASE 不會複製附加到來源資料庫的資料庫層級 GRANT 權限。新的資料庫具有預設的資料庫層級權限。

還有第二個名為 template0 的標準系統資料庫。 此資料庫包含與 template1 的初始內容相同的資料,也就是說,僅包含您的 PostgreSQL 版本預定義的標準物件。template0 在資料庫叢集初始化後絕不應更改。透過指示 CREATE DATABASE 複製 template0 而不是 template1,您可以建立一個原始使用者資料庫(其中不存在任何使用者定義的物件,並且系統物件未被更改),其中不包含 template1 中的任何站台本地新增項目。當還原 pg_dump 轉儲時,這特別方便:應將轉儲腳本還原到原始資料庫中,以確保重新建立轉儲資料庫的正確內容,而不會與稍後可能新增到 template1 的物件發生衝突。

複製 template0 而不是 template1 的另一個常見原因是,複製 template0 時可以指定新的編碼和語言環境設定,而 template1 的副本必須使用與其相同的設定。這是因為 template1 可能包含特定於編碼或特定於語言環境的資料,而 template0 已知不包含。

要透過複製 template0 來建立資料庫,請使用

CREATE DATABASE dbname TEMPLATE template0;

從 SQL 環境,或

createdb -T template0 dbname

從 shell。

可以建立其他範本資料庫,並且確實可以透過將叢集中任何資料庫的名稱指定為 CREATE DATABASE 的範本來複製該資料庫。但是,重要的是要了解,這(還)不打算作為通用COPY DATABASE工具。主要限制是,在複製來源資料庫時,沒有其他會話可以連接到該資料庫。如果啟動時存在任何其他連線,CREATE DATABASE 將會失敗;在複製作業期間,將阻止建立與來源資料庫的新連線。

在每個資料庫的 pg_database 中,存在兩個有用的旗標datistemplatedatallowconn 這兩個欄位。datistemplate 可被設定為指示該資料庫是否作為 CREATE DATABASE 指令的樣板。 如果設定此旗標,則任何擁有 CREATEDB 權限的使用者都可以複製該資料庫;如果未設定,則只有超級使用者和資料庫擁有者可以複製它。 如果 datallowconn 為 false,則不允許與該資料庫建立任何新連線 (但現有的連線不會僅僅因為設定此旗標為 false 而終止)。template0 資料庫通常會被標記為 datallowconn = false,以防止被修改。template0template1 都應始終標記為 datistemplate = true

注意

template1template0 除了 template1 這個名稱是 CREATE DATABASE 指令預設的來源資料庫名稱之外,沒有任何特殊狀態。 例如,可以刪除 template1 並從 template0 重新建立它,而不會產生任何不良影響。 如果不小心在 template1 中添加了一堆垃圾,則這種做法可能是明智的。(要刪除 template1,必須將 pg_database.datistemplate 設為 false。)

當初始化資料庫叢集時,也會建立 postgres 資料庫。 這個資料庫旨在作為使用者和應用程式連線的預設資料庫。 它只是 template1 的一個副本,如果需要可以刪除並重新建立。

提交更正

如果您在文件中發現任何不正確、與您特定功能的使用經驗不符或需要進一步澄清的地方,請使用此表格來回報文件問題。