# 创建出版物

CREATE PUBLICATION — 定义一个新的发布

# 概要

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

# 描述

创建出版物将新发布添加到当前数据库中。发布名称必须不同于当前数据库中任何现有发布的名称。

发布本质上是一组表,其数据更改旨在通过逻辑复制进行复制。看第 31.1 节有关发布如何适应逻辑复制设置的详细信息。

# 参数

姓名

新出版物的名称。

餐桌

指定要添加到发布的表列表。如果只要在表名之前指定,只有该表被添加到发布中。如果只要未指定时,将添加该表及其所有子表(如果有)。可选地,*可以在表名之后指定以明确指示包含后代表。但是,这不适用于分区表。分区表的分区总是隐式地被认为是发布的一部分,因此它们永远不会显式添加到发布中。

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

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

适用于所有桌子

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

和 ( *发布参数* [= *价值*] [, ... ])

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

发布(细绳)

此参数确定新发布将向订阅者发布哪些 DML 操作。该值是逗号分隔的操作列表。允许的操作是插入,更新,删除, 和截短.默认是发布所有动作,所以这个选项的默认值为'插入、更新、删除、截断'.

publish_via_partition_root(布尔值)

此参数确定发布中包含的分区表(或其分区)中的更改是否将使用分区表的标识和架构而不是实际更改的各个分区的标识和架构进行发布;后者是默认设置。启用此功能允许将更改复制到非分区表或由一组不同分区组成的分区表中。

如果启用此功能,截短直接在分区上执行的操作不会被复制。

# 笔记

如果两者都没有餐桌也不适用于所有桌子指定,则发布从一组空的表开始。如果以后要添加表,这很有用。

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

要创建发布,调用用户必须拥有创造当前数据库的权限。(当然,超级用户绕过了这个检查。)

要将表添加到发布中,调用用户必须拥有该表的所有权。这适用于所有桌子子句要求调用用户是超级用户。

添加到发布的发布的表更新和/或删除操作必须有副本身份定义。否则,这些表将不允许这些操作。

插入 ... 冲突命令,发布将发布该命令实际产生的操作。因此,根据结果,它可能会发布为插入或者更新,或者根本不会发布。

将表插入到分区树中,其根是使用具有以下内容的发布发布的publish_via_partition_root设置真的不会导致复制表的现有内容。

复制...从命令发布为插入操作。

DDL 操作未发布。

# 例子

创建在两个表中发布所有更改的发布:

CREATE PUBLICATION mypublication FOR TABLE users, departments;

创建一个发布所有表中所有更改的发布:

CREATE PUBLICATION alltables FOR ALL TABLES;

创建仅发布的出版物插入一张表中的操作:

CREATE PUBLICATION insert_only FOR TABLE mydata
    WITH (publish = 'insert');

# 兼容性

创建出版物是一个 PostgreSQL 扩展。

# 也可以看看

更改出版物, 删除出版物, 创建订阅, 更改订阅