CREATE PUBLICATION
用于向當前數據庫添加一個新的發布。
簡介
CREATE PUBLICATION
向當前數據庫添加一個新的發布。 發布的名稱必須與當前數據庫中任何現有發布的名稱不同。
發布本質上是一組表,其數據更改旨在通過邏輯復制進行復制。
語法
CREATE PUBLICATION name
[ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
| FOR ALL TABLES ]
[ WITH ( publication_parameter [= value] [, ... ] ) ]
參數
name
新發布的名稱。
FOR TABLE
指定要添加到發布的表的列表。如果在表名之前指定了ONLY
, 那么只有該表被添加到發布中。如果沒有指定ONLY
, 則添加表及其所有后代表(如果有的話)。可選地,可在表名之后指定以明確指示包含后代表。但是,這不適用于分區表。 分區表的分區始終被隱式視為發布的一部分,因此永遠不會明確將其添加到發布中。
只有持久基表和分區表才能成為出版物的一部分。 臨時表,未記錄表,外部表,物化視圖和常規視圖不能成為發布的一部分。
將分區表添加到發布時,其所有現有分區和將來分區都被隱式視為發布的一部分。 因此,即使直接在分區上執行的操作也會通過其祖先所在的發布來發布。
FOR ALL TABLES
將發布標記為復制數據庫中所有表的更改,包括在將來創建的表。
WITH (
publication_parameter
[=
value
] [, ... ] )
該子句指定發布的可選參數。支持下列參數:
publish
(string
)這個參數決定了哪些 DML 操作將由新的發布給訂閱者。 該值是用逗號分隔的操作列表。允許的操作是insert
, update
,delete
和truncate
。 默認是發布所有的動作,所以這個選項的默認值是'insert, update, delete, truncate'
。
publish_via_partition_root
(boolean
)此參數確定是否會使用分區表的標識和模式而不是實際更改的單個分區的標識和模式來發布中包含的分區表(或其分區)中的更改。 單個分區的標識和模式是默認設置。 啟用此功能可以將更改復制到非分區表或由一組不同的分區組成的分區表中。
如果啟用此功能,則不會復制直接在分區上執行的TRUNCATE
操作。
說明
如果既沒有指定FOR TABLE
,也沒有指定FOR ALL TABLES
, 那么這個發布就是以一組空表開始的。這在稍后添加表格的情況下是有用的。
創建發布不會開始復制。它只為未來的訂閱者定義一個分組和過濾邏輯。
要創建一個發布,調用者必須擁有當前數據庫的CREATE
權限。 (當然,超級用戶不需要這個檢查。)
要將表添加到發布中,調用者必須擁有該表的所有權。FOR ALL TABLES
子句要求調用者是超級用戶。
添加到發布UPDATE
和/或DELETE
操作的發布的表必須已經定義了REPLICA IDENTITY
。 否則將在這些表上禁止這些操作。
對于INSERT ... ON CONFLICT
命令, 發布將公布從命令實際產生的操作。因此,根據結果,它可以作為 INSERT
或UPDATE
發布,也可以根本不發布。
COPY ... FROM
命令是作為INSERT
操作發布的。
不發布 DDL 操作。
示例
創建一個發布,發布兩個表中所有更改布:
CREATE PUBLICATION mypublication FOR TABLE users, departments;
創建一個發布,發布所有表中的所有更改:
CREATE PUBLICATION alltables FOR ALL TABLES;
創建一個發布,只發布一個表中的INSERT
操作:
CREATE PUBLICATION insert_only FOR TABLE mydata
WITH (publish = 'insert');