选择 打开 改范围 完整检索页

pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。

文档 / SQL 命令 / 逻辑复制

SQL COMMAND · 逻辑复制

ALTER PUBLICATION

修改发布的定义

ALTER逻辑复制引入 10(基线)现存至 20 devel2 次语法变更

动词
ALTER
对象
PUBLICATION
引入版本
10(基线)
状态
现存
语法变更次数
2
手册小节数
5

本站手册 · 18官方文档 ↗

版本轨迹

相对 PostgreSQL 17 无变化。

语法铁道图 PostgreSQL 18

沿轨道从左向右阅读,分岔表示选择,绕行表示可选,回环表示重复。方框为参数,点击带下划线的参数可展开子规则。

ALTER PUBLICATION name ADD publication_object ,
ALTER PUBLICATION · 语法 2
ALTER PUBLICATION name SET publication_object ,
ALTER PUBLICATION · 语法 3
ALTER PUBLICATION name DROP publication_drop_object ,
ALTER PUBLICATION · 语法 4
ALTER PUBLICATION name SET ( publication_parameter = value , )
ALTER PUBLICATION · 语法 5
ALTER PUBLICATION name OWNER TO new_owner CURRENT_ROLE CURRENT_USER SESSION_USER
ALTER PUBLICATION · 语法 6
ALTER PUBLICATION name RENAME TO new_name
publication_object
TABLE table_and_columns , TABLES IN SCHEMA schema_name CURRENT_SCHEMA ,
publication_drop_object
TABLE ONLY table_name * , TABLES IN SCHEMA schema_name CURRENT_SCHEMA ,
table_and_columns
ONLY table_name * ( column_name , ) WHERE ( expression )

语法概要

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
其中publication_object可以是:

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

其中publication_drop_object可以是:

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

其中table_and_columns是:

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

PostgreSQL 18 手册 · 查看完整参考页

描述

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

前三种形式会更改哪些表或模式属于该发布。SET子句 会用指定列表替换发布中的表或模式列表;原先已在该发布中的表或模式将 被移除。ADDDROP子句则会向发 布中添加或移除一个或多个表或模式。请注意,向已经被订阅的发布中添加 表或模式后,需要在订阅端执行 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 操作后才会生效。还要注意,DROP TABLES IN SCHEMA 不会移除那些通过 FOR TABLE/ADD TABLE 指定的模式中的表。

提要中列出的第四种形式可更改CREATE PUBLICATION 中指定的所有发布属性。命令中未提及的属性会保留其先前的设置。

其余几种形式用于更改发布的所有者和名称。

要使用ALTER PUBLICATION,你必须拥有该发布。 向发布中添加表还要求拥有该表。对发布执行 ADD TABLES IN SCHEMASET TABLES IN SCHEMA要求调用用户为超级用户。 要更改所有者,你必须能够对新的拥有角色执行SET ROLE, 并且该角色必须在数据库上具有CREATE权限。此外, FOR ALL TABLESFOR TABLES IN SCHEMA 发布的新所有者也必须是超级用户。不过,超级用户可以不受这些限制而更 改发布的所有权。

如果某个发布还发布了带列列表的表,则不支持向其中添加或设置任何模 式;反之亦然。

参数

name

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

table_name

现有表的名称。如果在表名前指定了ONLY,则只有该 表受影响。如果未指定ONLY,则该表及其所有后代 表(如果有)都会受影响。还可以在表名后指定*, 以显式指明包含后代表。

还可以指定列列表。详见CREATE PUBLICATION。 请注意,不支持这样的订阅:它包含多个发布,并且同一张表在这些发布 中使用不同的列列表发布。有关更改列列表时可能出现的问题,详见 警告:组合来自多个发布的列列表

如果指定了可选的WHERE子句,则 expression计算结果为 false 或 null 的行不会被发布。请注意,表达式外围必须有括号。 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;

将模式marketingsales 添加到发布sales_publication中:

ALTER PUBLICATION sales_publication ADD TABLES IN SCHEMA marketing, sales;

将表usersdepartments和模式 production添加到发布 production_publication中:

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

兼容性

ALTER PUBLICATIONPostgreSQL的一个扩展。

另见

语法演化

相邻大版本之间的差异,新的在前。版本号链接到对应快照。

  1. PostgreSQL 20← 19正文更新

    正文更新
  2. PostgreSQL 19← 18语法变化

    + ALTER PUBLICATION name SET { publication_object [, ...] | publication_all_object [, ... ] }+ 其中publication_all_object可以是:+ + ALL TABLES [ EXCEPT ( except_table_object [, ... ] ) ]+ ALL SEQUENCES+ + TABLE table_object [, ... ]+ table_object [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]+ 其中except_table_object是:+ + TABLE table_object [, ... ]+ + 其中table_object是:+ + [ ONLY ] table_name [ * ]− ALTER PUBLICATION name SET publication_object [, ...]− TABLE [ ONLY ] table_name [ * ] [, ... ]− [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]正文更新
  3. PostgreSQL 15← 14正文更新

    正文更新
  4. PostgreSQL 14← 13语法变化

    + ALTER PUBLICATION name ADD publication_object [, ...]+ ALTER PUBLICATION name SET publication_object [, ...]+ ALTER PUBLICATION name DROP publication_drop_object [, ...]+ ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }+ 其中publication_object可以是:+ + TABLE table_and_columns [, ... ]+ TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]+ + 其中publication_drop_object可以是:+ + TABLE [ ONLY ] table_name [ * ] [, ... ]+ TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]+ + 其中table_and_columns是:+ + [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]− ALTER PUBLICATION name ADD TABLE [ ONLY ] table_name [ * ] [, ...]− ALTER PUBLICATION name SET TABLE [ ONLY ] table_name [ * ] [, ...]− ALTER PUBLICATION name DROP TABLE [ ONLY ] table_name [ * ] [, ...]− ALTER PUBLICATION name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }正文更新

同组命令

命令动词对象版本变动最近变更
LOGICAL REPLICATION逻辑复制6 条
CREATE PUBLICATIONCREATEPUBLICATION 192 次
定义一个新的发布现存
ALTER PUBLICATIONALTERPUBLICATION 192 次
修改发布的定义现存
DROP PUBLICATIONDROPPUBLICATION
移除一个发布现存
CREATE SUBSCRIPTIONCREATESUBSCRIPTION 191 次
定义一个新的订阅现存
ALTER SUBSCRIPTIONALTERSUBSCRIPTION 192 次
修改订阅的定义现存
DROP SUBSCRIPTIONDROPSUBSCRIPTION
移除一个订阅现存