更新时间:2026-07-02 GMT+08:00
分享

CREATE PUBLICATION

功能描述

为当前数据库添加一个新的发布(PUBLICATION)。

发布本质上是通过逻辑复制将一组表的数据变更进行复制。数据库将自动跟踪并捕获这些源表上发生的数据操作(INSERT, UPDATE,DELETE和TRUNCATE),并通过逻辑复制机制,持续地将这些变更数据传输给所有配置并订阅(CREATE SUBSCRIPTION)该发布的目标数据库,从而实现源端到目标端的数据同步。

注意事项

  • 该语法仅8.2.0.100及以上集群版本支持。
  • 创建发布的用户必须拥有当前数据库的CREATE权限。
  • 新创建的发布的名称不能与当前数据库中任何现有发布的名称相同。
  • 要将表添加到发布中,操作用户必须拥有该表的所有权。FOR ALL TABLES和FOR ALL TABLES IN SCHEMA子句要求用户具有系统管理员权限。
  • 如果创建发布时未指定FOR TABLE,也未指定FOR ALL TABLES, 则该发布是一组空表,后续可以通过ALTER PUBLICATION命令在该发布添加表。
  • CREATE PUBLICATION不会启动复制过程,只为未来的订阅者定义一个分组和过滤逻辑。
  • 不能同时通过FOR TABLE和FOR ALL TABLES IN SCHEMA方式添加同一个待发布表到同一个发布中。

语法格式

1
2
3
4
CREATE PUBLICATION name
    [ FOR ALL TABLES
      | FOR publication_object [, ... ] ]
    [ WITH ( publication_parameter [=value] [, ... ] ) ];

其中,发布对象publication_object为:

TABLE table_name [, ...]
| ALL TABLES IN SCHEMA schema_name [, ... ]

参数说明

表1 CREATE PUBLICATION参数说明

参数

描述

取值范围

name

新发布的名称。

字符串,要符合标识符的命名规范。参见标识符命名规范

FOR ALL TABLES

将发布标记为复制数据库中所有细粒度容灾主表的更改,包括在将来创建的表。

-

FOR TABLE

指定要添加到发布的表的列表。只有细粒度容灾主表才能成为发布的一部分。

-

table_name

要添加到发布的表的名字,可以带模式名。

有效的表名称。

FOR ALL TABLES IN SCHEMA

将发布标记为复制指定模式列表中所有细粒度容灾主表的更改,包括在将来创建的表。

-

schema_name

要添加到发布的模式的名字。

有效的模式名称。

WITH ( publication_parameter [=value] [, ... ] )

该子句指定发布的可选参数,当前支持publish参数。

publish参数决定了哪些DML操作将由新的发布给订阅者。

  • 取值范围:字符串,用逗号分隔的操作列表。允许的操作为:INSERT、 UPDATE、DELETE和TRUNCATE。
  • 默认值为:'insert, update, delete, truncate',表示默认发布所有操作。

-

示例

  • 创建模式、示例表及样例数据。
    CREATE SCHEMA pub_demo;
    
    CREATE TABLE pub_demo.sales
     (
        sale_id    INTEGER,
        product    VARCHAR(50),
        amount     INTEGER NOT NULL,
        sale_date  DATE
    ) WITH (ORIENTATION = COLUMN,enable_disaster_cstore='on') DISTRIBUTE BY HASH ( sale_id);
    
    CREATE TABLE pub_demo.customers 
    (
        cust_id   INTEGER,
        cust_name VARCHAR(50),
        region    VARCHAR(20)
    ) WITH (ORIENTATION = COLUMN,enable_disaster_cstore='on') DISTRIBUTE BY HASH ( cust_id);
    
    INSERT INTO pub_demo.sales VALUES (1, 'Laptop', 500, '2026-01-15');
    INSERT INTO pub_demo.sales VALUES (2, 'Mouse',  900,  '2026-01-16');
    INSERT INTO pub_demo.customers VALUES (101, 'Alice', 'East');
    INSERT INTO pub_demo.customers VALUES (102, 'Bob',   'West');
  • 创建发布,发布所有表。
    1
    CREATE PUBLICATION pub_all_tables FOR ALL TABLES;
    
  • 创建发布,发布单个表sales 。
    1
    CREATE PUBLICATION pub_sales_only FOR TABLE pub_demo.sales;
    
  • 创建发布,发布单个表sales的所有操作(INSERT、 UPDATE、DELETE和TRUNCATE)。默认包含全部操作,也可显式声明。
    1
    2
    3
    CREATE PUBLICATION pub_sales_all_ops 
    FOR TABLE pub_demo.sales 
    WITH (publish = 'insert, update, delete, truncate');
    
  • 创建发布,发布单个表customers的INSERT操作。
    1
    2
    3
    CREATE PUBLICATION pub_cust_insert 
    FOR TABLE pub_demo.customers 
    WITH (publish = 'insert');
    

相关文档