CREATE PUBLICATION — 定義新的發布 (publication)
CREATE PUBLICATIONname
[ FOR ALL TABLES | FORpublication_object
[, ... ] ] [ WITH (publication_parameter
[=value
] [, ... ] ) ] wherepublication_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
子句,它會定義一個 列過濾器表達式。對於 expression
評估為 false 或 null 的列將不會發布。請注意,表達式需要用括號括起來。它對 TRUNCATE
命令沒有影響。
當指定列清單時,只會複製指定的列。如果未指定列清單,則會透過此發布複製表的所有列,包括稍後新增的任何列。它對 TRUNCATE
命令沒有影響。有關列清單的詳細資訊,請參閱第 29.5 節。
只有持久的基本表和分割表才能成為發布的一部分。暫存表、未記錄表、外部表、實體化檢視和常規檢視不能成為發布的一部分。
當發布也發布 FOR TABLES IN SCHEMA
時,不支援指定列清單。
當分割表新增到發布時,其所有現有和未來的分區都會隱含地被視為發布的一部分。因此,即使直接在分區上執行的操作也會透過其祖先所屬的發布進行發布。
FOR ALL TABLES
#將發布標記為複製資料庫中所有表變更的發布,包括將來建立的表。
FOR TABLES IN SCHEMA
#將發布標記為複製指定架構清單中所有表變更的發布,包括將來建立的表。
當發布也發布帶有列清單的表時,不支援指定架構。
只有架構中存在的持久基本表和分割表才會被包含作為發布的一部分。來自架構的暫存表、未記錄表、外部表、實體化檢視和常規檢視將不會成為發布的一部分。
當透過架構層級發布發布分割表時,其所有現有和未來的分區都會隱含地被視為發布的一部分,無論它們是否來自發布架構。因此,即使直接在分區上執行的操作也會透過其祖先所屬的發布進行發布。
WITH ( publication_parameter
[= value
] [, ... ] )
#此子句指定發布的可選參數。支援以下參數
publish
(string
) #此參數決定新的發布將向訂閱者發布哪些 DML 操作。該值是用逗號分隔的操作清單。允許的操作包括 insert
、update
、delete
和 truncate
。預設值是發布所有操作,因此此選項的預設值為 'insert, update, delete, truncate'
。
此參數僅影響 DML 操作。特別是,邏輯複製的初始資料同步(請參閱第 29.8.1 節)在複製現有表資料時不會考慮此參數。
publish_via_partition_root
(boolean
) #此參數決定是否使用分割表的標識和架構(而不是實際變更的個別分區的標識和架構)來發布發布中包含的分割表(或其分區)中的變更;後者是預設設定。啟用此選項允許將變更複製到非分割表或由不同分區集組成的分割表。
有時一個訂閱可能會組合多個發布。如果分區表被任何設定了 publish_via_partition_root = true
的已訂閱發布所發布,則對此分區表(或其分區)的變更將使用此分區表的識別碼和綱要來發布,而不是使用個別分區的。
此參數也會影響如何為分區選擇列篩選器和欄位清單;詳情請見下文。
如果啟用此設定,則直接在分區上執行的 TRUNCATE
操作將不會被複製。
當指定 boolean
類型的參數時,可以省略 =
value
部分,這等同於指定 TRUE
。
如果未指定 FOR TABLE
、FOR ALL TABLES
或 FOR TABLES IN SCHEMA
,則發布開始時將擁有一組空的表格。這對於之後要新增表格或綱要很有用。
建立發布不會啟動複製。它僅定義未來訂閱者的分組和篩選邏輯。
要建立發布,呼叫的使用者必須擁有目前資料庫的 CREATE
權限。(當然,超級使用者會繞過此檢查。)
要將表格新增到發布中,呼叫的使用者必須擁有該表格的所有權。FOR ALL TABLES
和 FOR TABLES IN SCHEMA
子句要求呼叫的使用者必須是超級使用者。
新增到發布 UPDATE
和/或 DELETE
操作的表格必須定義 REPLICA IDENTITY
。否則,這些操作將不允許在這些表格上執行。
任何欄位清單都必須包含 REPLICA IDENTITY
欄位,才能發布 UPDATE
或 DELETE
操作。如果發布僅發布 INSERT
操作,則沒有欄位清單限制。
列篩選器表達式(即 WHERE
子句)必須僅包含 REPLICA IDENTITY
涵蓋的欄位,才能發布 UPDATE
和 DELETE
操作。對於發布 INSERT
操作,任何欄位都可以在 WHERE
表達式中使用。列篩選器允許簡單的表達式,這些表達式沒有使用者定義的函式、使用者定義的運算符、使用者定義的類型、使用者定義的排序規則、非不可變的內建函式或對系統欄位的引用。
如果指定了 FOR TABLES IN SCHEMA
且表格屬於引用的綱要,則表格上的列篩選器將變得多餘。
對於已發布的分區表,如果發布參數 publish_via_partition_root
為 true,則每個分區的列篩選器取自已發布的分區表;如果為 false(預設值),則取自分區本身。有關列篩選器的詳細資訊,請參閱 第 29.4 節。同樣地,對於已發布的分區表,如果發布參數 publish_via_partition_root
為 true,則每個分區的欄位清單取自已發布的分區表;如果為 false,則取自分區本身。
對於 INSERT ... ON CONFLICT
命令,發布將發布命令產生的操作。根據結果,它可能會以 INSERT
或 UPDATE
的形式發布,或者可能根本不發布。
對於 MERGE
命令,發布將為每個插入、更新或刪除的列發布一個 INSERT
、UPDATE
或 DELETE
。
使用將 publish_via_partition_root
設定為 true
的發布來發布分區樹的根目錄,將表格 ATTACH
到該分區樹中,不會導致該表格現有的內容被複製。
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');
建立一個發布,發布表格 users
、departments
的所有變更,以及綱要 production
中所有表格的所有變更
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
建立一個發布,發布綱要 marketing
和 sales
中所有表格的所有變更
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
建立一個發布,發布表格 users
的所有變更,但僅複製欄位 user_id
和 firstname
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
CREATE PUBLICATION
是 PostgreSQL 的擴充功能。
如果您在文件中發現任何不正確、與您使用特定功能的經驗不符或需要進一步澄清的地方,請使用此表格來報告文件問題。