CREATE PUBLICATION — 定义一个新的发布
CREATE PUBLICATIONname
[ FOR TABLE [ ONLY ]table_name
[ * ] [, ...] | FOR ALL TABLES ] [ WITH (publication_parameter
[=value
] [, ... ] ) ]
CREATE PUBLICATION
向当前数据库添加一个新的发布。
发布的名称必须与当前数据库中任何现有发布的名称不同。
发布本质上是一组表,其数据更改旨在通过逻辑复制进行复制。 有关发布如何适应逻辑复制设置的详细信息, 请参见第 31.1 节。
name
新发布的名称。
FOR TABLE
指定要添加到发布的表的列表。如果在表名之前指定了ONLY
,
那么只有该表被添加到发布中。如果没有指定ONLY
,
则添加表及其所有后代表(如果有的话)。可选地,
可以在表名之后指定*
以明确指示包含后代表。
只有持久基表才能成为出版物的一部分。临时表、非日志表、外表、物化视图、 常规视图和分区表不能成为发布的一部分。要复制分区表, 请将各个分区添加到发布中。
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
扩展。