2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10

CREATE PUBLICATION

CREATE PUBLICATION — 定義一個新發布

概要

CREATE PUBLICATION name
    [ FOR ALL TABLES
      | FOR publication_object [, ... ] ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ]

where publication_object is one of:

    TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
    TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]

描述

CREATE PUBLICATION 將一個新發布新增到當前資料庫。釋出名稱必須與當前資料庫中任何現有釋出的名稱不同。

釋出本質上是一組表的集合,這些表的更改旨在透過邏輯複製進行復制。有關釋出如何融入邏輯複製設定的詳細資訊,請參閱 第 29.1 節

引數

name #

新發布的名稱。

FOR TABLE #

指定要新增到釋出的表列表。如果在表名前指定了 ONLY,則僅將該表新增到釋出中。如果未指定 ONLY,則將該表及其所有後代表(如果有)新增到釋出中。可以選擇在表名後指定 * 以明確指示包含後代表。但這不適用於分割槽表。分割槽表的表分割槽始終被隱式視為釋出的一部分,因此它們永遠不會被顯式新增到釋出中。

如果指定了可選的 WHERE 子句,它將定義一個 行過濾器 表示式。計算結果為 false 或 null 的行將不會被髮布。請注意,表示式周圍必須加上括號。這對 TRUNCATE 命令沒有影響。

當指定列列表時,只複製命名的列。列列表也可以包含儲存的生成列。如果省略列列表,預設情況下,釋出將複製所有非生成列(包括將來新增的任何列)。如果 publish_generated_columns 設定為 stored,也可以複製儲存的生成列。指定列列表對 TRUNCATE 命令沒有影響。有關列列表的詳細資訊,請參閱 第 29.5 節

只有持久基表和分割槽表才能作為釋出的一部分。臨時表、未記錄表、外部表、物化檢視和普通檢視不能作為釋出的一部分。

在釋出 FOR TABLES IN SCHEMA 的同時指定列列表不受支援。

當一個分割槽表被新增到釋出中時,它所有現有的和未來的分割槽都被隱式視為釋出的一部分。因此,即使是直接在分割槽上執行的操作,也會透過其祖先所屬的釋出被髮布。

FOR ALL TABLES #

將釋出標記為複製資料庫中所有表(包括將來建立的表)的更改。

FOR TABLES IN SCHEMA #

將釋出標記為複製指定模式列表中所有表(包括將來建立的表)的更改。

在釋出帶有列列表的表的同時指定模式不受支援。

只有模式中存在的持久基表和分割槽表才會被包含在釋出中。模式中的臨時表、未記錄表、外部表、物化檢視和普通檢視將不會作為釋出的一部分。

當一個分割槽表透過模式級別的釋出進行釋出時,它所有現有的和未來的分割槽都被隱式視為釋出的一部分,無論它們是否屬於釋出模式。因此,即使是直接在分割槽上執行的操作,也會透過其祖先所屬的釋出被髮布。

WITH ( publication_parameter [= value] [, ... ] ) #

此子句指定釋出的可選引數。支援以下引數:

publish (string) #

此引數決定新發布將向訂閱者釋出哪些 DML 操作。該值是以逗號分隔的操作列表。允許的操作是 insertupdatedeletetruncate。預設情況下發布所有操作,因此此選項的預設值為 'insert, update, delete, truncate'

此引數僅影響 DML 操作。特別是,邏輯複製的初始資料同步(請參閱 第 29.9.1 節)在複製現有表資料時不會考慮此引數。

publish_generated_columns (enum) #

指定是否複製與釋出關聯的表中的生成列。可能的值是 nonestored

預設值為 none,表示釋出關聯的表中的生成列將不會被複制。

如果設定為 stored,則複製釋出關聯的表中的儲存的生成列。

注意

如果訂閱者是 18 版本之前的版本,那麼即使釋出者中的 publish_generated_columns 引數設定為 stored,初始表同步也不會複製生成列。

有關生成列邏輯複製的更多詳細資訊,請參閱 第 29.6 節

publish_via_partition_root (boolean) #

此引數決定釋出中的分割槽表(或其分割槽)的更改是使用分割槽表的身份和模式釋出,還是使用實際更改的單個分割槽的身份和模式釋出(後者是預設設定)。啟用此選項可以允許將更改複製到非分割槽表或由不同分割槽集組成的分割槽表。

可能存在訂閱組合多個釋出的情況。如果分割槽表由任何已訂閱的釋出(這些釋出設定了 publish_via_partition_root = true)進行釋出,則對該分割槽表(或其分割槽)的更改將使用該分割槽表的身份和模式釋出,而不是單個分割槽的身份和模式。

此引數還會影響如何為分割槽選擇行過濾器和列列表;有關詳細資訊,請參閱下文。

如果啟用此選項,則直接在分割槽上執行的 TRUNCATE 操作不會被複制。

指定型別為 boolean 的引數時,可以省略 = value 部分,這等同於指定 TRUE

註釋

如果未指定 FOR TABLEFOR ALL TABLESFOR TABLES IN SCHEMA,則釋出最初為空表集。如果以後要新增表或模式,這很有用。

釋出建立本身不會啟動複製。它僅為將來的訂閱者定義分組和過濾邏輯。

要建立釋出,呼叫使用者必須擁有當前資料庫的 CREATE 許可權。(當然,超級使用者會繞過此檢查。)

要將表新增到釋出中,呼叫使用者必須擁有該表的擁有權。 FOR ALL TABLESFOR TABLES IN SCHEMA 子句要求呼叫使用者是超級使用者。

新增到釋出中的釋出 UPDATE 和/或 DELETE 操作的表必須定義 REPLICA IDENTITY。否則,這些操作在該表上將被禁止。

任何列列表都必須包含 REPLICA IDENTITY 列,以便釋出 UPDATEDELETE 操作。如果釋出僅釋出 INSERT 操作,則沒有列列表限制。

行過濾器表示式(即 WHERE 子句)必須僅包含 REPLICA IDENTITY 涵蓋的列,以便釋出 UPDATEDELETE 操作。對於 INSERT 操作的釋出,可以在 WHERE 表示式中使用任何列。行過濾器允許不包含使用者定義函式、使用者定義運算子、使用者定義型別、使用者定義排序規則、非不變內建函式或系統列引用的簡單表示式。

REPLICA IDENTITY 的一部分的生成列必須透過在列列表中列出它們或啟用 publish_generated_columns 選項來顯式釋出,以便釋出 UPDATEDELETE 操作。

如果指定了 FOR TABLES IN SCHEMA 並且該表屬於引用的模式,則該表上的行過濾器將變得多餘。

對於已釋出的表,如果釋出引數 publish_via_partition_root 為 true,則每個分割槽的行過濾器將從已釋出的表獲取;如果為 false(預設值),則從分割槽本身獲取。有關行過濾器的詳細資訊,請參閱 第 29.4 節。類似地,對於已釋出的表,如果釋出引數 publish_via_partition_root 為 true,則每個分割槽的列列表將從已釋出的表獲取;如果為 false,則從分割槽本身獲取。

對於 INSERT ... ON CONFLICT 命令,釋出將釋出由該命令產生的結果。根據結果,它可能會作為 INSERTUPDATE 釋出,或者根本不釋出。

對於 MERGE 命令,釋出將為每個插入、更新或刪除的行釋出一個 INSERTUPDATEDELETE

將一個表 ATTACH 到使用 publish_via_partition_root 設定為 true 的釋出釋出的根目錄的分割槽樹中,不會導致複製表的內容。

COPY ... FROM 命令被髮布為 INSERT 操作。

DDL操作不會被髮布。

WHERE 子句表示式使用用於複製連線的角色來執行。

示例

建立一個釋出,該釋出將釋出兩個表中的所有更改

CREATE PUBLICATION mypublication FOR TABLE users, departments;

建立一個釋出,該釋出將釋出來自活動部門的所有更改

CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);

建立一個釋出,該釋出將釋出所有表中的所有更改

CREATE PUBLICATION alltables FOR ALL TABLES;

建立一個釋出,該釋出僅釋出一個表中的 INSERT 操作

CREATE PUBLICATION insert_only FOR TABLE mydata
    WITH (publish = 'insert');

建立一個釋出,該釋出將釋出 usersdepartments 表中的所有更改,以及 production 模式中所有表中的所有更改

CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;

建立一個釋出,該釋出將釋出 marketingsales 模式中所有表中的所有更改

CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;

建立一個釋出,該釋出將釋出 users 表中的所有更改,但僅複製 user_idfirstname

CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);

相容性

CREATE PUBLICATIONPostgreSQL 的擴充套件。

提交更正

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