ALTER PUBLICATION
ALTER PUBLICATION — 修改发布的定义
大纲
ALTER PUBLICATIONnameADDpublication_object[, ...] ALTER PUBLICATIONnameDROPpublication_drop_object[, ...] ALTER PUBLICATIONnameSET {publication_object[, ...] |publication_all_object[, ... ] } ALTER PUBLICATIONnameSET (publication_parameter[=value] [, ... ] ) ALTER PUBLICATIONnameOWNER TO {new_owner| CURRENT_ROLE | CURRENT_USER | SESSION_USER } ALTER PUBLICATIONnameRENAME TOnew_name其中publication_object可以是: TABLEtable_and_columns[, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] 其中publication_all_object可以是: ALL TABLES [ EXCEPT (except_table_object[, ... ] ) ] ALL SEQUENCES 其中publication_drop_object可以是: TABLEtable_object[, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] 其中table_and_columns是:table_object[ (column_name[, ... ] ) ] [ WHERE (expression) ] 其中except_table_object是: TABLEtable_object[, ... ] 其中table_object是: [ ONLY ]table_name[ * ]
描述
ALTER PUBLICATION 命令可更改发布的属性。
前两种形式会更改哪些表或模式属于该发布。ADD 和
DROP 子句则会向发布中添加或移除一个或多个表或模式。
第三种形式要么更改已包含的表或模式,要么将发布标记为
FOR ALL SEQUENCES 或 FOR ALL TABLES,并可选地使用 EXCEPT 排除特定表。SET ALL TABLES
子句可以将一个空发布,或者一个定义为 ALL SEQUENCES 的发布(或同时定义为 ALL TABLES 和 ALL SEQUENCES 的发布),转换为定义为 ALL TABLES 的发布。同样地,SET ALL SEQUENCES 可以将一个空发布,或者一个定义为
ALL TABLES 的发布(或同时定义为 ALL TABLES
和 ALL SEQUENCES 的发布),转换为定义为
ALL SEQUENCES 的发布。此外,SET ALL TABLES
还可用于更新 FOR ALL TABLES 发布中 EXCEPT
子句指定的表。如果指定了带表列表的 EXCEPT,则现有排除列表会被替换为指定的表。如果省略 EXCEPT,则现有排除列表会被清空。对于使用 FOR TABLE 或 FOR TABLES IN SCHEMA
定义的发布,SET 子句会用指定列表替换发布中的表或模式列表;原先已在该发布中的表或模式将被移除。
请注意,向已经被订阅的发布中添加、删除或设置表或模式后,需要在订阅端执行
ALTER SUBSCRIPTION ... REFRESH PUBLICATION
操作后才会生效。同样,将发布更改为 ALL TABLES,更改 EXCEPT 列表,或者设置
ALL SEQUENCES,也要求订阅端刷新该发布。还要注意,DROP TABLES IN SCHEMA 不会移除那些位于模式中、但通过
FOR TABLE/ADD TABLE
单独指定的表。
提要中列出的第四种形式可更改 CREATE PUBLICATION 中指定的所有发布属性。命令中未提及的属性会保留其先前的设置。
其余几种形式用于更改发布的所有者和名称。
要使用 ALTER PUBLICATION,你必须拥有该发布。向发布中添加表还要求拥有该表。对发布执行
ADD TABLES IN SCHEMA、SET TABLES IN SCHEMA、SET ALL TABLES 和 SET ALL SEQUENCES
要求调用用户为超级用户。要更改所有者,你必须能够对新的拥有角色执行 SET ROLE,并且该角色必须在数据库上具有 CREATE 权限。此外,FOR TABLES IN SCHEMA
或 FOR ALL TABLES
或 FOR ALL SEQUENCES
发布的新所有者也必须是超级用户。不过,超级用户可以不受这些限制而更改发布的所有权。
如果某个发布还发布了带列列表的表,则不支持向其中添加或设置任何模式;反之亦然。
参数
name#要更改其定义的现有发布名称。
table_name#现有表的名称。如果在
table_name前指定了ONLY,则只影响该表。如果未指定ONLY,则影响该表及其所有后代表(如果有)。也可以在table_name后指定*,以显式表明包含后代表。还可以指定列列表。详见 CREATE PUBLICATION。请注意,不支持这样的订阅:它包含多个发布,并且同一张表在这些发布中使用不同的列列表发布。有关更改列列表时可能出现的问题,详见警告:组合来自多个发布的列列表。
如果指定了可选的
WHERE子句,则expression计算结果为 false 或 null 的行不会被发布。请注意,表达式外围必须有括号。expression会使用复制连接所用的角色来求值。column_name#table_name中现有列的名称。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;
替换发布中 EXCEPT 子句的表列表:
ALTER PUBLICATION mypublication SET ALL TABLES EXCEPT (TABLE users, departments);
将发布重置为不带排除表的 FOR ALL TABLES 发布:
ALTER PUBLICATION mypublication SET ALL TABLES;
将模式 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 的一个扩展。