CREATE PUBLICATION — 定义一个新的发布
CREATE PUBLICATIONname
[ FOR ALL TABLES | FORpublication_object
[, ... ] ] [ WITH (publication_parameter
[=value
] [, ... ] ) ] wherepublication_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
命令没有影响。
当指定列列表时,只会复制指定的列。如果未指定列列表,则通过此发布复制表的所有列,包括以后添加的任何列。它对 TRUNCATE
命令没有影响。 有关列列表的详细信息,请参阅第 29.5 节。
只有持久的基础表和分区表才能成为发布的一部分。临时表、未记录的表、外部表、物化视图和常规视图不能成为发布的一部分。
当发布还发布 FOR TABLES IN SCHEMA
时,不支持指定列列表。
当将分区表添加到发布时,它所有现有和未来的分区都将被隐式地视为发布的一部分。因此,即使是直接在分区上执行的操作,也会通过其祖先所在的发布进行发布。
FOR ALL TABLES
#将发布标记为复制数据库中所有表的更改的发布,包括将来创建的表。
FOR TABLES IN SCHEMA
#将发布标记为复制指定模式列表中所有表的更改的发布,包括将来创建的表。
当发布还发布带有列列表的表时,不支持指定模式。
只有模式中存在的持久基础表和分区表才会被包含在发布中。模式中的临时表、未记录的表、外部表、物化视图和常规视图不会成为发布的一部分。
当通过模式级发布发布分区表时,它所有现有和未来的分区都将被隐式地视为发布的一部分,无论它们是否来自发布模式。 因此,即使是直接在分区上执行的操作,也会通过其祖先所在的发布进行发布。
WITH ( publication_parameter
[= value
] [, ... ] )
#此子句指定发布的可选参数。支持以下参数
publish
(string
) #此参数确定新发布将向订阅者发布哪些 DML 操作。该值是以逗号分隔的操作列表。允许的操作是 insert
、update
、delete
和 truncate
。 默认是发布所有操作,因此此选项的默认值为 'insert, update, delete, truncate'
。
此参数仅影响 DML 操作。 特别是,逻辑复制的初始数据同步(请参阅第 29.8.1 节)在复制现有表数据时不会考虑此参数。
publish_via_partition_root
(boolean
) #此参数确定是否使用分区表的标识和模式(而不是实际更改的各个分区的标识和模式)来发布发布中包含的分区表(或其分区)中的更改;后者是默认值。 启用此功能可以使更改复制到非分区表或由不同分区集组成的分区表中。
可能存在订阅组合多个发布的情况。 如果任何订阅的发布通过设置 publish_via_partition_root = true
来发布分区表,则此分区表(或其分区)上的更改将使用此分区表的标识和模式而不是各个分区的标识和模式进行发布。
此参数还会影响如何为分区选择行过滤器和列列表;有关详细信息,请参见下文。
如果启用此功能,则不会复制直接在分区上执行的 TRUNCATE
操作。
当指定类型为 boolean
的参数时,可以省略 =
value
部分,这等效于指定 TRUE
。
如果未指定 FOR TABLE
、FOR ALL TABLES
或 FOR TABLES IN SCHEMA
,则发布开始时将具有一个空的表集。如果以后要添加表或模式,这将很有用。
创建发布不会启动复制。它仅定义未来订阅者的分组和筛选逻辑。
要创建发布,调用用户必须对当前数据库具有 CREATE
权限。(当然,超级用户会绕过此检查。)
要将表添加到发布,调用用户必须具有该表的所有权。 FOR ALL TABLES
和 FOR TABLES IN SCHEMA
子句要求调用用户是超级用户。
添加到发布中以发布 UPDATE
和/或 DELETE
操作的表必须定义 REPLICA IDENTITY
。 否则,这些操作将被禁止在这些表上执行。
任何列列表都必须包含 REPLICA IDENTITY
列,才能发布 UPDATE
或 DELETE
操作。 如果发布仅发布 INSERT
操作,则没有列列表限制。
行过滤器表达式(即 WHERE
子句)必须仅包含 REPLICA IDENTITY
所覆盖的列,才能发布 UPDATE
和 DELETE
操作。 对于发布 INSERT
操作,任何列都可以用于 WHERE
表达式。 行过滤器允许不包含用户定义的函数、用户定义的操作符、用户定义的类型、用户定义的排序规则、非不可变内置函数或对系统列的引用的简单表达式。
如果指定 FOR TABLES IN SCHEMA
并且该表属于引用的模式,则表上的行过滤器将变得冗余。
对于发布的分区表,如果发布参数 publish_via_partition_root
为 true,则每个分区的行过滤器取自已发布的分区表;如果为 false(默认值),则取自分区本身。 有关行过滤器的详细信息,请参阅第 29.4 节。 类似地,对于发布的分区表,如果发布参数 publish_via_partition_root
为 true,则每个分区的列列表取自已发布的分区表;如果为 false,则取自分区本身。
对于 INSERT ... ON CONFLICT
命令,发布将发布该命令产生的结果操作。 根据结果,它可能会发布为 INSERT
或 UPDATE
,或者可能根本不会发布。
对于 MERGE
命令,发布将为插入、更新或删除的每一行发布一个 INSERT
、UPDATE
或 DELETE
。
将表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');
创建一个发布,发布表 users
, departments
的所有更改,以及架构 production
中存在的所有表的所有更改
CREATE PUBLICATION production_publication FOR TABLE users, departments, TABLES IN SCHEMA production;
创建一个发布,发布架构 marketing
和 sales
中存在的所有表的所有更改
CREATE PUBLICATION sales_publication FOR TABLES IN SCHEMA marketing, sales;
创建一个发布,发布表 users
的所有更改,但仅复制列 user_id
和 firstname
CREATE PUBLICATION users_filtered FOR TABLE users (user_id, firstname);
CREATE PUBLICATION
是 PostgreSQL 的扩展。
如果您发现文档中有任何不正确的地方,或者与您使用特定功能的体验不符,或者需要进一步澄清,请使用此表单报告文档问题。