2025年9月25日: PostgreSQL 18 发布!
支持的版本:当前 (18) / 17 / 16 / 15 / 14 / 13
开发版本:devel
不支持的版本:12 / 11 / 10

ALTER PUBLICATION

ALTER PUBLICATION — 更改发布(publication)的定义

概要

ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_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 [ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ] [, ... ]
    TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]

描述

命令 ALTER PUBLICATION 可以更改发布(publication)的属性。

前三个变体更改哪些表/模式(schema)是发布(publication)的一部分。 SET 子句将用指定的列表替换发布(publication)中的表/模式列表;发布(publication)中已存在的表/模式将被移除。 ADDDROP 子句将添加和移除一个或多个表/模式到发布(publication)中。 请注意,添加表/模式到已订阅的发布(publication)中,需要在订阅端执行 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 操作才能生效。另请注意,DROP TABLES IN SCHEMA 不会删除使用 FOR TABLE / ADD TABLE 指定的模式(schema)中的任何表,并且不允许 DROPWHERE 子句结合使用。

命令语法摘要中的第四个变体可以更改 CREATE PUBLICATION 中指定的发布(publication)的所有属性。未在命令中提及的属性将保留其先前设置。

其余变体更改发布(publication)的所有者和名称。

要使用 ALTER PUBLICATION,您必须拥有该发布(publication)。向发布(publication)添加表还需要拥有该表。将表添加到发布(publication)或设置发布(publication)中的表需要调用用户是超级用户。要更改所有者,您必须能够 SET ROLE 到新的拥有角色,并且该角色必须在该数据库上具有 CREATE 权限。此外,FOR ALL TABLESFOR TABLES IN SCHEMA 发布(publication)的新所有者必须是超级用户。但是,超级用户可以更改发布(publication)的所有权,而不受这些限制的约束。

不支持向同时发布具有列列表的表的发布(publication)添加/设置任何模式(schema),反之亦然。

参数

name

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

table_name

现有表的名称。如果在表名前指定了 ONLY,则仅影响该表。如果未指定 ONLY,则影响该表及其所有后代表(如果有)。可选地,可以在表名后指定 * 以明确表示包含后代表。

可选地,可以指定列列表。有关详细信息,请参阅 CREATE PUBLICATION。请注意,不支持订阅(subscription)具有多个发布(publication),其中同一表已使用不同的列列表发布。有关更改列列表时可能出现问题的详细信息,请参阅 警告:组合来自多个发布(publication)的列列表

如果指定了可选的 WHERE 子句,则不会发布 expression 计算结果为 false 或 null 的行。请注意,表达式周围必须包含括号。 expression 使用用于复制连接(replication connection)的角色进行计算。

schema_name

现有模式(schema)的名称。

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

此子句更改由 CREATE PUBLICATION 最初设置的发布(publication)参数。有关更多信息,请参阅该处。

注意

更改 publish_via_partition_root 参数可能导致订阅者(subscriber)端的数据丢失或重复,因为它会更改发布(publication)表的身份和模式(schema)。请注意,只有当分区根表(partition root table)被指定为复制目标(replication target)时才会发生这种情况。

可以通过在执行 ALTER SUBSCRIPTION ... REFRESH PUBLICATION 之前不修改分区叶表(partition leaf tables),并且仅使用 copy_data = off 选项进行刷新来避免此问题。

new_owner

新发布(publication)所有者的用户名。

new_name

发布(publication)的新名称。

示例

将发布(publication)更改为仅发布删除和更新

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

向发布(publication)添加一些表

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

更改发布(publication)的已发布列集

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

将模式(schema)marketingsales 添加到发布(publication)sales_publication

ALTER PUBLICATION sales_publication ADD TABLES IN SCHEMA marketing, sales;

将表 usersdepartments 和模式(schema)production 添加到发布(publication)production_publication

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

兼容性

ALTER PUBLICATIONPostgreSQL 的一个扩展。

提交更正

如果您在文档中发现任何不正确、不符合您对特定功能的使用体验或需要进一步澄清的内容,请使用 此表单 报告文档问题。