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 的一個擴充套件。

提交更正

如果您在文件中發現任何不正確、不符合您對特定功能的使用體驗或需要進一步澄清的內容,請使用 此表單 報告文件問題。