↑↓ 选择↵ 打开⌫ 切换范围完整搜索

PG.CENTER 连接 PostgreSQL 文档、百科与生态知识。由 Pigsty 维护。

支持中的版本: 当前版本 (18) / 17 / 16 / 15 / 14
开发中的版本: 19 / 20devel
已结束支持的版本: 13 / 12 / 11 / 10
历史版本。 PostgreSQL 13 已结束支持。 2025-11-13. 请参阅 当前版本手册.

CREATE PUBLICATION

CREATE PUBLICATION — 定义一个新的发布

大纲

CREATE PUBLICATION name
    [ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
      | FOR ALL TABLES ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ]

描述

CREATE PUBLICATION 向当前数据库中添加一个新发布。该发布的名称必须不同于当前数据库中任何现有发布的名称。

发布本质上是一组表,其数据更改会通过逻辑复制进行复制。有关发布在逻辑复制配置中如何工作的详细信息,请参见第 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'。

publish_via_partition_root (boolean)

此参数决定发布中包含的分区表(或其分区)中的更改是使用分区表的标识和模式发布,还是使用实际发生更改的各个分区的标识和模式发布;后者为默认值。启用此选项后,可以将更改复制到非分区表,或复制到由不同分区集合组成的分区表。

启用此选项后,直接在分区上执行的 TRUNCATE 操作不会被复制。

注解

如果既未指定 FOR TABLE 也未指定 FOR ALL TABLES,则该发布开始时不包含任何表。这对于稍后添加表很有用。

创建发布不会启动复制。它只为未来的订阅者定义分组和过滤逻辑。

要创建发布,调用用户必须具有当前数据库的 CREATE 权限。(当然,超级用户会绕过这一检查。)

要向发布中添加表,调用用户必须拥有该表。FOR ALL TABLES 子句要求调用用户是超级用户。

如果某个发布发布 UPDATE 和/或 DELETE 操作,则加入该发布的表必须已经定义 REPLICA IDENTITY。否则,在这些表上将不允许执行这些操作。

对于 INSERT ... ON CONFLICT 命令,发布会发布该命令实际产生的操作。根据执行结果,它可能被发布为 INSERT 或 UPDATE,也可能根本不被发布。

将表 ATTACH 到某个分区树中,而该分区树的根通过 publish_via_partition_root 设为 true 的发布进行发布时,不会复制该表的现有内容。

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 的扩展。

报告文档问题

阅读 上游文档. 反馈更正前请先核对 当前版本手册.