PostgreSQL 中文参考文档
🌐 英文原版 官方 ↗

ALTER PUBLICATION

ALTER PUBLICATION — 更改一个发布的定义

Synopsis

ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_drop_object [, ...]
ALTER PUBLICATION name SET ( publication_parameter [= value] [, ... ] )
ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION name RENAME TO new_name

where publication_object is one of:

    TABLE table_and_columns [, ... ]
    TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]

and publication_drop_object is one of:

    TABLE [ ONLY ] table_name [ * ] [, ... ]
    TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]

and table_and_columns is:

    [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]

描述

ALTER PUBLICATION 命令可以更改一个发布的属性。

前三种变体更改哪些表/模式属于该发布。SET 子句将用指定的列表替换该发布中的表/模式列表;该发布中原有的表/模式将被移除。ADD 和 DROP 子句会向该发布中添加以及从该发布中移除一个或多个表/模式。注意,向一个已被订阅的发布中添加表/模式将需要在订阅端执行 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 动作才能生效。还要注意,DROP TABLES IN SCHEMA 不会删除任何使用 FOR TABLE/ ADD TABLE 指定的模式表。

此命令在概要中列出的第四种变体可以更改 CREATE PUBLICATION 中指定的所有发布属性。命令中未提及的属性将保持其原有设置。

其余的变体会更改该发布的拥有者和名称。

要使用 ALTER PUBLICATION,你必须拥有该发布。向发布中添加一个表还额外要求拥有该表。对发布使用 ADD TABLES IN SCHEMA 和 SET TABLES IN SCHEMA 要求调用用户是超级用户。要更改拥有者,你必须能够 SET ROLE 到新的拥有角色,并且该角色必须在该数据库上具有 CREATE 特权。此外,FOR ALL TABLES 或 FOR TABLES IN SCHEMA 发布的新拥有者必须是超级用户。不过,超级用户可以无视这些限制更改发布的拥有者。

当该发布还发布了一个带列列表的表时,不支持添加/设置任何模式,反之亦然。

参数

name

要修改其定义的现有发布的名称。

table_name

一个现有表的名称。如果在表名之前指定了 ONLY,则只有该表会受到影响。如果没有指定 ONLY,则该表及其所有后代表(如果有的话)都会受到影响。可以选择在表名之后指定 *,以显式指示包含后代表。

还可以选择指定一个列列表。详情请参见 CREATE PUBLICATION。注意,不支持这样一种订阅:它拥有多个发布,而同一个表在这些发布中以不同的列列表被发布。有关更改列列表时潜在问题的详细信息,请参见 Section 29.5.1。

如果指定了可选的 WHERE 子句,则 expression 求值为假或空的行将不会被发布。注意,表达式两侧必须加上圆括号。expression 会以用于复制连接的角色来求值。

schema_name

一个现有模式的名称。

SET ( publication_parameter [= value] [, ... ] )

该子句会更改最初由 CREATE PUBLICATION 设置的发布参数。更多信息请参见该处。

Caution

更改 publish_via_partition_root 参数可能导致订阅端出现数据丢失或重复,因为它会改变被发布表的标识和模式。注意,只有当一个分区根表被指定为复制目标时才会发生这种情况。

要避免这个问题,可以在 ALTER PUBLICATION ... SET 之后、ALTER SUBSCRIPTION ... REFRESH PUBLICATION 执行之前,避免修改分区叶子表,并且只使用 copy_data = off 选项进行刷新。

new_owner

该发布新拥有者的用户名。

new_name

该发布的新名称。

示例

将该发布更改为只发布删除和更新:

ALTER PUBLICATION noinsert SET (publish = 'update, delete');

向该发布中添加一些表:

ALTER PUBLICATION mypublication ADD TABLE users (user_id, firstname), departments;

更改为某个表发布的列的集合:

ALTER PUBLICATION mypublication SET TABLE users (user_id, firstname, lastname), TABLE departments;

将模式 marketing 和 sales 添加到发布 sales_publication 中:

ALTER PUBLICATION sales_publication ADD TABLES IN SCHEMA marketing, sales;

将表 users、departments 和模式 production 添加到发布 production_publication 中:

ALTER PUBLICATION production_publication ADD TABLE users, departments, TABLES IN SCHEMA production;

兼容性

ALTER PUBLICATION 是 PostgreSQL 的扩展。

另请参阅

CREATE PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION