阅读(4550) (10)

PostgreSQL CREATE PUBLICATION

2021-08-23 14:27:07 更新

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, 则添加表及其所有后代表(如果有的话)。可选地,可以在表名之后指定 *以明确指示包含后代表。但是,这不适用于分区表。 分区表的分区始终被隐式视为发布的一部分,因此永远不会明确将其添加到发布中。

只有持久基表和分区表才能成为出版物的一部分。 临时表,未记录表,外部表,物化视图和常规视图不能成为发布的一部分。

将分区表添加到发布时,其所有现有分区和将来分区都被隐式视为发布的一部分。 因此,即使直接在分区上执行的操作也会通过其祖先所在的发布来发布。

FOR ALL TABLES

将发布标记为复制数据库中所有表的更改,包括在将来创建的表。

WITH ( publication_parameter [= value] [, ... ] )

该子句指定发布的可选参数。支持下列参数:

publish (string)

这个参数决定了哪些DML操作将由新的发布发布给订阅者。 该值是用逗号分隔的操作列表。允许的操作是insertupdatedeletetruncate。 默认是发布所有的动作,所以这个选项的默认值是'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命令, 发布将公布从命令实际产生的操作。因此,根据结果,它可以作为 INSERTUPDATE发布,也可以根本不发布。

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