Postgresql 中文操作指南
Synopsis
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 } [, ... ]
Description
CREATE PUBLICATION 向当前数据库中添加一个新出版物。出版物名称必须与当前数据库中任何现有出版物的名称不同。
本质上,出版物就是一组表,其数据更改旨在通过逻辑复制进行复制。有关出版物如何融入逻辑复制设置中的详细信息,请参见 Section 31.1 。
Parameters
-
name #
-
新出版物的名称。
-
-
FOR TABLE #
-
指定要添加到出版物中的表列表。如果在表名前指定 ONLY ,则只有该表会被添加到出版物中。如果未指定 ONLY ,则会添加该表及其所有后代表(如果有)。另外,可以在表名后指定 * 以明确表明包含后代表。但这不是适用的分区表。分区表的分区始终被隐式视为出版物的一部分,因此它们永远不会被明确添加到出版物中。
-
如果指定可选的 WHERE 子句,它将定义 row filter 表达式。 expression 求值为 false 或 null 的行将不会被发布。请注意,需要在表达式周围加上括号。它不对 TRUNCATE 命令产生影响。
-
当指定了列列表时,只有命名的列才会被复制。如果未指定列列表,则会通过此出版物复制表的全部列,包括晚些时候添加的任何列。它不对 TRUNCATE 命令产生影响。有关列列表的详细信息,请参见 Section 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 操作。特别是,逻辑复制的初始数据同步(参见 Section 31.7.1 )在复制现有表数据时不会考虑此参数。
-
-
publish_via_partition_root (boolean) #
-
此参数确定发布中包含的分区表(或其分区)中的更改是否使用分区表(而非实际更改的各个分区的)身份和架构发布;后者是默认值。启用此项可以让更改复制到非分区表或由不同分区集合组成的分区表中。
-
可能会出现订阅结合多个发布的情况。如果分区表由已订阅并且设置了 publish_via_partition_root = true 的任何发布发布,则此分区表(或其分区)的更改将使用此分区表(而非实际更改的各个分区的)身份和架构发布。
-
此参数还会影响如何在分区中选择行过滤器和列列表;有关详细信息,请参见以下内容。
-
如果启用此项,则直接对分区执行的 TRUNCATE 操作不会被复制。
-
在指定类型为 boolean 的参数时,可以省略 = value 部分,这等同于指定 TRUE 。
Notes
如果未指定 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 语句)为了发布 UPDATE 和 DELETE 操作,只能包含 REPLICA IDENTITY 涵盖的列。为了发布 INSERT 操作,任何列都可以用于 WHERE 表达式中。行过滤器允许使用的简单表达式没有用户自定义函数、用户自定义运算符、用户自定义类型、用户自定义排序规则、不可更改的内置函数或对系统列的引用。
如果指定 FOR TABLES IN SCHEMA 并且该表属于所引用的架构,则该表的行过滤器将变得多余。
对于已发布的分区表,如果发布参数 publish_via_partition_root 为真,则每个分区的行过滤器将取自已发布的分区表;如果为假(默认值),则取自分区本身。有关行过滤器的详细信息,请参见 Section 31.3 。同样,对于已发布的分区表,如果发布参数 publish_via_partition_root 为真,则每个分区的列列表将取自已发布的分区表;如果为假,则取自分区本身。
对于 INSERT … ON CONFLICT 命令,发布将发布该命令产生的操作。根据结果,它可能发布为 INSERT 或 UPDATE ,也可能根本不发布。
对于 MERGE 命令,发布将针对每行插入、更新或删除发布 INSERT 、 UPDATE 或 DELETE 。
将 ATTACH_ing a table into a partition tree whose root is published using a publication with _publish_via_partition_root 设置为 true 不会导致复制该表的现有内容。
COPY … FROM 命令作为 INSERT 操作发布。
不发布 DDL 操作。
使用复制连接角色执行 WHERE 子句表达式。
Examples
创建一个发布所有两个表中更改的发布:
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);