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
子句,则它会定义一个 行筛选器 表达式。将不会发布那些 expression
对于其求值为假或空的行。请注意,表达式周围需要圆括号。这不会影响 TRUNCATE
命令。
当指定列列表时,只复制指定的列。如果未指定列列表,则通过此发行复制表的所有列,包括稍后添加的任何列。这不会影响 TRUNCATE
命令。有关列列表的详细信息,请参见 第 29.5 节。
只有持久的基表和分区表可以成为发行的一部分。临时表、未记录的表、外部表、物化视图和常规视图不能成为发行的一部分。
不支持在发行同时发布 FOR TABLES IN SCHEMA
时指定列列表。
将分区表添加到发行后,其所有现有和未来的分区都将隐式视为发行的一部分。因此,即使直接在分区上执行的操作也会通过其祖先所属的发行来发布。
FOR ALL TABLES
#将发行标记为复制数据库中所有表(包括将来创建的表)的更改的发行。
FOR TABLES IN SCHEMA
#将发行标记为复制指定架构列表中所有表(包括将来创建的表)的更改的发行。
不支持在发行同时发布具有列列表的表时指定架构。
仅将架构中存在的持久的基表和分区表作为发行的一部分纳入其中。架构中的临时表、未记录的表、外部表、物化视图和常规视图不会成为发行的一部分。
通过模式级别发布发布分区表时,无论它们是否来自发布模式,其现有和将来的分区都被隐式视为发布的一部分。因此,即使直接对某个分区执行操作,也会通过其祖先成为成员的发布进行发布。
WITH ( publication_parameter
[= value
] [, ... ] )
#此条款指定了 publication 的可选参数。支持以下参数
publish
(string
) #此参数决定了新的 publication 将向订阅者发布哪些 DML 操作。该值是由逗号分隔的操作列表。允许的操作有 insert
、update
、delete
和 truncate
。默认为发布所有操作,因此此选项的默认值为 'insert, update, delete, truncate'
。
此参数仅影响 DML 操作。具体来说,对此参数不会对用于复制现有表格数据的逻辑复制的初始数据同步(请参阅 第 29.8.1 款)产生影响。
publish_via_partition_root
(boolean
) #此参数决定了 publication 中所包含的分区表(或其分区)中的更改是否将使用分区表的标识和模式(而非实际更改的各个分区)来发布;后者为默认值。启用此功能使更改能够复制到非分区表或一个包含一组不同分区的分区表。
可能是订阅组合了多个 publication 的情况。如果分区表由任何设置 publish_via_partition_root = true
的已订阅的 publication 发布,则将使用此分区表的标识和模式(而非各个分区的标识和模式)发布此分区表(或其分区)上的更改。
此参数还影响如何为分区选择行过滤器和列列表;请参阅下文以了解详情。
如果已启用此功能,则不会复制直接对分区执行的 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
。否则,将禁止对这些表执行这些操作。
为发布 UPDATE
或 DELETE
操作,任何列列表必须包含 REPLICA IDENTITY
列。如果发布仅发布 INSERT
操作,则没有列列表限制。
行筛选器表达式(即 WHERE
子句)必须仅包含 REPLICA IDENTITY
涵盖的列,才能发布 UPDATE
和 DELETE
操作。对于 INSERT
操作的发布,可在 WHERE
表达式中使用任何列。行筛选器允许的简单表达式不包含用户定义函数、用户定义运算符、用户定义类型、用户定义排序规则、不可变内置函数或对系统列的引用。
如果指定了 FOR TABLES IN SCHEMA
并且表属于所引用的架构,则表的行筛选器将变得冗余。
对于已发布的分区表,如果发布参数 publish_via_partition_root
为真,则每个分区的行筛选器取自已发布的分区表;如果为假(默认设置),则取自分区本身。有关行筛选器的详细信息,请参见第 29.4 节。类似地,对于已发布的分区表,如果发布参数 publish_via_partition_root
为真,则每个分区的列列表取自已发布的分区表;如果为假,则取自分区本身。
对于 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 扩展。