ALTER PUBLICATION — 更改一个发布的定义
ALTER PUBLICATIONnameADDpublication_object[, ...] ALTER PUBLICATIONnameSETpublication_object[, ...] ALTER PUBLICATIONnameDROPpublication_drop_object[, ...] ALTER PUBLICATIONnameSET (publication_parameter[=value] [, ... ] ) ALTER PUBLICATIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER PUBLICATIONnameRENAME TOnew_namewherepublication_objectis one of: TABLEtable_and_columns[, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] andpublication_drop_objectis one of: TABLE [ ONLY ]table_name[ * ] [, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] andtable_and_columnsis: [ 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 设置的发布参数。更多信息请参见该处。
更改 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 的扩展。