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
在当前数据库中添加一个新发布。发布名称必须不同于当前数据库中任何现有发布的名称。
发布本质上是一组表,其数据更改旨在通过逻辑复制进行复制。有关发布如何适应逻辑复制设置的详细信息,请参见第 31.1 节。
名称
#新发布的名称。
FOR TABLE
#指定要添加到发布中的表列表。如果在表名前指定 ONLY
,则仅该表将被添加到发布中。如果未指定 ONLY
,则将添加该表及其所有后代表(如果存在)。还可以选择在表名后指定 *
以明确指示包括后代表。但这不适用于分区表。分区表的分区始终被隐式视为发布的一部分,因此它们永远不会被明确添加到发布中。
如果指定了可选的 WHERE
子句,则它将定义一个行筛选器表达式。对于表达式
求值为 false 或 null 的行,将不会发布。请注意,表达式周围需要括号。它对 TRUNCATE
命令没有影响。
如果指定了列列表,则只会复制已命名的列。如果未指定列列表,则通过此发布复制表的所有列,包括稍后添加的任何列。它对 TRUNCATE
命令没有影响。有关列列表的详细信息,请参见第 31.4 节。
只有持久基本表和分区表可以是发布的一部分。临时表、未记录表、外部表、物化视图和常规视图不能是发布的一部分。
当发布也发布 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 操作。特别是,逻辑复制的初始数据同步(请参见第 31.7.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(默认值),则从分区本身获取。有关行筛选器的详细信息,请参见 第 31.3 节。类似地,对于发布的分区表,如果发布参数 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扩展。