ALTER PUBLICATION
修改发布的定义
英文手册覆盖始于 PostgreSQL 6.4. 来源历史与运行验证各自保留独立版本边界。
当前阅读 PG 18·选择有来源记录的版本
- anchor
- SQL-ALTERPUBLICATION
- file
- sql-alterpublication.html
- lang
- en
- name
- ALTER PUBLICATION
- purpose
- change the definition of a publication
- purpose zh
- 未知
- sections same as
- 未知
- slug
- 18
语法
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_drop_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 table_and_columns [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and publication_drop_object is one of:
TABLE [ ONLY ] table_name [ * ] [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and table_and_columns is:
[ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]语法图
从左向右阅读;分支表示选择,旁路表示可选,循环表示重复。点击带下划线的参数可打开对应规则。
ALTER PUBLICATION · 语法 2
ALTER PUBLICATION · 语法 3
ALTER PUBLICATION · 语法 4
ALTER PUBLICATION · 语法 5
ALTER PUBLICATION · 语法 6
publication_object
publication_drop_object
table_and_columns
版本定义 PG 18
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_drop_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
其中publication_object可以是:
TABLE table_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的一个扩展。
另见
CREATE PUBLICATION, DROP PUBLICATION, CREATE SUBSCRIPTION, ALTER SUBSCRIPTION比较版本
完整来源事实
synopsis html
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> ADD <em class="replaceable"><code>publication_object</code></em> [, ...]
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> SET <em class="replaceable"><code>publication_object</code></em> [, ...]
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> DROP <em class="replaceable"><code>publication_drop_object</code></em> [, ...]
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> SET ( <em class="replaceable"><code>publication_parameter</code></em> [= <em class="replaceable"><code>value</code></em>] [, ... ] )
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> OWNER TO { <em class="replaceable"><code>new_owner</code></em> | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
ALTER PUBLICATION <em class="replaceable"><code>name</code></em> RENAME TO <em class="replaceable"><code>new_name</code></em>
<span class="phrase">where <em class="replaceable"><code>publication_object</code></em> is one of:</span>
TABLE <em class="replaceable"><code>table_and_columns</code></em> [, ... ]
TABLES IN SCHEMA { <em class="replaceable"><code>schema_name</code></em> | CURRENT_SCHEMA } [, ... ]
<span class="phrase">and <em class="replaceable"><code>publication_drop_object</code></em> is one of:</span>
TABLE [ ONLY ] <em class="replaceable"><code>table_name</code></em> [ * ] [, ... ]
TABLES IN SCHEMA { <em class="replaceable"><code>schema_name</code></em> | CURRENT_SCHEMA } [, ... ]
<span class="phrase">and <em class="replaceable"><code>table_and_columns</code></em> is:</span>
[ ONLY ] <em class="replaceable"><code>table_name</code></em> [ * ] [ ( <em class="replaceable"><code>column_name</code></em> [, ... ] ) ] [ WHERE ( <em class="replaceable"><code>expression</code></em> ) ]synopsis text
ALTER PUBLICATION name ADD publication_object [, ...]
ALTER PUBLICATION name SET publication_object [, ...]
ALTER PUBLICATION name DROP publication_drop_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 table_and_columns [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and publication_drop_object is one of:
TABLE [ ONLY ] table_name [ * ] [, ... ]
TABLES IN SCHEMA { schema_name | CURRENT_SCHEMA } [, ... ]
and table_and_columns is:
[ ONLY ] table_name [ * ] [ ( column_name [, ... ] ) ] [ WHERE ( expression ) ]来源引用
定义来源
center · PostgreSQL 18 · a709ab85
正文语言: zh-Hans · 1b5ca64c