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,或者设置或取消 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 #现有表的名称。如果在表名前指定了ONLY,则只有该 表受影响。如果未指定ONLY,则该表及其所有后代 表(如果有)都会受影响。还可以在表名后指定*, 以显式指明包含后代表。
还可以指定列列表。详见CREATE PUBLICATION。 请注意,不支持这样的订阅:它包含多个发布,并且同一张表在这些发布 中使用不同的列列表发布。有关更改列列表时可能出现的问题,详见 警告:组合来自多个发布的列列表。
如果指定了可选的WHERE子句,则 expression计算结果为 false 或 null 的行不会被发布。请注意,表达式外围必须有括号。 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;
替换发布中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的一个扩展。