2025年9月25日: PostgreSQL 18 发布!
支持的版本: 当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本: devel
不支持的版本: 12 / 11 / 10

CREATE PUBLICATION

CREATE PUBLICATION — 定义一个新发布

概要

CREATE PUBLICATION name
    [ FOR ALL TABLES
      | FOR publication_object [, ... ] ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ]

where publication_object is one of:

    TABLE [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
    TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]

描述

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

发布本质上是一组表的集合,这些表的更改旨在通过逻辑复制进行复制。有关发布如何融入逻辑复制设置的详细信息,请参阅 第 29.1 节

参数

name #

新发布的名称。

FOR TABLE #

指定要添加到发布的表列表。如果在表名前指定了 ONLY,则仅将该表添加到发布中。如果未指定 ONLY,则将该表及其所有后代表(如果有)添加到发布中。可以选择在表名后指定 * 以明确指示包含后代表。但这不适用于分区表。分区表的表分区始终被隐式视为发布的一部分,因此它们永远不会被显式添加到发布中。

如果指定了可选的 WHERE 子句,它将定义一个 行过滤器 表达式。计算结果为 false 或 null 的行将不会被发布。请注意,表达式周围必须加上括号。这对 TRUNCATE 命令没有影响。

当指定列列表时,只复制命名的列。列列表也可以包含存储的生成列。如果省略列列表,默认情况下,发布将复制所有非生成列(包括将来添加的任何列)。如果 publish_generated_columns 设置为 stored,也可以复制存储的生成列。指定列列表对 TRUNCATE 命令没有影响。有关列列表的详细信息,请参阅 第 29.5 节

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

在发布 FOR TABLES IN SCHEMA 的同时指定列列表不受支持。

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

FOR ALL TABLES #

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

FOR TABLES IN SCHEMA #

将发布标记为复制指定模式列表中所有表(包括将来创建的表)的更改。

在发布带有列列表的表的同时指定模式不受支持。

只有模式中存在的持久基表和分区表才会被包含在发布中。模式中的临时表、未记录表、外部表、物化视图和普通视图将不会作为发布的一部分。

当一个分区表通过模式级别的发布进行发布时,它所有现有的和未来的分区都被隐式视为发布的一部分,无论它们是否属于发布模式。因此,即使是直接在分区上执行的操作,也会通过其祖先所属的发布被发布。

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

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

publish (string) #

此参数决定新发布将向订阅者发布哪些 DML 操作。该值是以逗号分隔的操作列表。允许的操作是 insertupdatedeletetruncate。默认情况下发布所有操作,因此此选项的默认值为 'insert, update, delete, truncate'

此参数仅影响 DML 操作。特别是,逻辑复制的初始数据同步(请参阅 第 29.9.1 节)在复制现有表数据时不会考虑此参数。

publish_generated_columns (enum) #

指定是否复制与发布关联的表中的生成列。可能的值是 nonestored

默认值为 none,表示发布关联的表中的生成列将不会被复制。

如果设置为 stored,则复制发布关联的表中的存储的生成列。

注意

如果订阅者是 18 版本之前的版本,那么即使发布者中的 publish_generated_columns 参数设置为 stored,初始表同步也不会复制生成列。

有关生成列逻辑复制的更多详细信息,请参阅 第 29.6 节

publish_via_partition_root (boolean) #

此参数决定发布中的分区表(或其分区)的更改是使用分区表的身份和模式发布,还是使用实际更改的单个分区的身份和模式发布(后者是默认设置)。启用此选项可以允许将更改复制到非分区表或由不同分区集组成的分区表。

可能存在订阅组合多个发布的情况。如果分区表由任何已订阅的发布(这些发布设置了 publish_via_partition_root = true)进行发布,则对该分区表(或其分区)的更改将使用该分区表的身份和模式发布,而不是单个分区的身份和模式。

此参数还会影响如何为分区选择行过滤器和列列表;有关详细信息,请参阅下文。

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

指定类型为 boolean 的参数时,可以省略 = value 部分,这等同于指定 TRUE

注释

如果未指定 FOR TABLEFOR ALL TABLESFOR TABLES IN SCHEMA,则发布最初为空表集。如果以后要添加表或模式,这很有用。

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

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

要将表添加到发布中,调用用户必须拥有该表的拥有权。 FOR ALL TABLESFOR TABLES IN SCHEMA 子句要求调用用户是超级用户。

添加到发布中的发布 UPDATE 和/或 DELETE 操作的表必须定义 REPLICA IDENTITY。否则,这些操作在该表上将被禁止。

任何列列表都必须包含 REPLICA IDENTITY 列,以便发布 UPDATEDELETE 操作。如果发布仅发布 INSERT 操作,则没有列列表限制。

行过滤器表达式(即 WHERE 子句)必须仅包含 REPLICA IDENTITY 涵盖的列,以便发布 UPDATEDELETE 操作。对于 INSERT 操作的发布,可以在 WHERE 表达式中使用任何列。行过滤器允许不包含用户定义函数、用户定义运算符、用户定义类型、用户定义排序规则、非不变内置函数或系统列引用的简单表达式。

REPLICA IDENTITY 的一部分的生成列必须通过在列列表中列出它们或启用 publish_generated_columns 选项来显式发布,以便发布 UPDATEDELETE 操作。

如果指定了 FOR TABLES IN SCHEMA 并且该表属于引用的模式,则该表上的行过滤器将变得多余。

对于已发布的表,如果发布参数 publish_via_partition_root 为 true,则每个分区的行过滤器将从已发布的表获取;如果为 false(默认值),则从分区本身获取。有关行过滤器的详细信息,请参阅 第 29.4 节。类似地,对于已发布的表,如果发布参数 publish_via_partition_root 为 true,则每个分区的列列表将从已发布的表获取;如果为 false,则从分区本身获取。

对于 INSERT ... ON CONFLICT 命令,发布将发布由该命令产生的结果。根据结果,它可能会作为 INSERTUPDATE 发布,或者根本不发布。

对于 MERGE 命令,发布将为每个插入、更新或删除的行发布一个 INSERTUPDATEDELETE

将一个表 ATTACH 到使用 publish_via_partition_root 设置为 true 的发布发布的根目录的分区树中,不会导致复制表的内容。

COPY ... FROM 命令被发布为 INSERT 操作。

DDL操作不会被发布。

WHERE 子句表达式使用用于复制连接的角色来执行。

示例

创建一个发布,该发布将发布两个表中的所有更改

CREATE PUBLICATION mypublication FOR TABLE users, departments;

创建一个发布,该发布将发布来自活动部门的所有更改

CREATE PUBLICATION active_departments FOR TABLE departments WHERE (active IS TRUE);

创建一个发布,该发布将发布所有表中的所有更改

CREATE PUBLICATION alltables FOR ALL TABLES;

创建一个发布,该发布仅发布一个表中的 INSERT 操作

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

创建一个发布,该发布将发布 usersdepartments 表中的所有更改,以及 production 模式中所有表中的所有更改

CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;

创建一个发布,该发布将发布 marketingsales 模式中所有表中的所有更改

CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;

创建一个发布,该发布将发布 users 表中的所有更改,但仅复制 user_idfirstname

CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);

兼容性

CREATE PUBLICATIONPostgreSQL 的扩展。

提交更正

如果您在文档中发现任何不正确、与您对特定功能的体验不符或需要进一步澄清的内容,请使用 此表格 来报告文档问题。