CREATE PUBLICATION — 定义一个新的发布
CREATE PUBLICATIONname[ FOR TABLE [ ONLY ]table_name[ * ] [, ...] | FOR ALL TABLES ] [ WITH (publication_parameter[=value] [, ... ] ) ]
CREATE PUBLICATION向当前数据库中添加一个新发布。 该发布的名称必须不同于当前数据库中任何现有发布的名称。
发布本质上是一组表,其数据更改会通过逻辑复制进行复制。 有关发布在逻辑复制配置中如何工作的详细信息, 请参见Section 30.1。
name新发布的名称。
FOR TABLE指定要添加到发布中的表列表。如果在表名之前指定ONLY,则仅将该表添加到发布中。如果未指定ONLY,则将该表及其所有后代表(如果有)添加到发布中。也可以在表名后指定*,以明确表示包含后代表。
只有持久的基表可以成为发布的一部分。临时表、不记录 WAL 的表、外部表、物化视图、普通视图和分区表不能成为发布的一部分。要复制分区表,请将各个分区添加到发布中。
FOR ALL TABLES将发布标记为复制数据库中所有表(包括将来创建的表)的更改。
WITH ( publication_parameter [= value] [, ... ] )此子句指定发布的可选参数。支持以下参数:
publish (string)此参数确定新发布将向订阅者发布哪些 DML 操作。该值是以逗号分隔的操作列表。允许的操作包括insert、update、delete和truncate。默认发布所有操作,因此此选项的默认值为'insert, update, delete, 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');
CREATE PUBLICATION是PostgreSQL 的扩展。