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_name其中publication_object可以是: TABLEtable_and_columns[, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] 其中publication_drop_object可以是: TABLE [ ONLY ]table_name[ * ] [, ... ] TABLES IN SCHEMA {schema_name| CURRENT_SCHEMA } [, ... ] 其中table_and_columns是: [ 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。 请注意,不支持这样的订阅:它包含多个发布,并且同一张表在这些发布 中使用不同的列列表发布。有关更改列列表时可能出现的问题,详见 警告:组合来自多个发布的列列表。
如果指定了可选的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;
将模式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的一个扩展。
如果您发现文档中有不正确的内容、与您使用特定功能的经验不符或需要进一步说明,请使用此表单来报告文档问题。