CREATE PUBLICATION

CREATE PUBLICATION — 定义一个新的publication

Synopsis

CREATE PUBLICATION name
    [ FOR TABLE [ ONLY ] table_name [ * ] [, ...]
      | FOR ALL TABLES ]
    [ WITH ( publication_parameter [= value] [, ... ] ) ]

简介

CREATE PUBLICATION在当前数据库中增加一个新的publication。publication的名字必须与当前数据库中任何现有的publication不同。

publication实际上是一组表,其中的数据改变会被用逻辑复制复制出去。有关如何将publication用于逻辑复制设置的详情请见Section 31.1

参数

name

新publication的名称。

FOR TABLE

指定要加入到publication中的表列表。如果在表名前指定ONLY,则只有表会被加入到publication。如果没有指定ONLY,则表及其后代(如果有)都会被加入到publication。可选地,在表名后指定*可以明确地指示将后代表包括在内。

只有持久的基表才能成为publication的一部分。临时表、不做日志的表、外部表、物化视图、常规视图以及分区表不能作为publication的组成部分。要复制一个分区表,应将各个分区加入到publication中。

FOR ALL TABLES

将publication标记为复制数据库中所有的表上的更改,包括未来创建的表在内。

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

这个子句为publication指定可选的参数。支持下列参数:

publish (string)

这个参数决定新publication将会把哪些DML操作发布给订阅者。这个参数的值是用逗号分隔的操作列表。允许的操作是insertupdatedelete以及truncate。默认是发布所有的动作,因此这个选项的默认值是'insert, update, delete, truncate'

注解

如果既没有指定FOR TABLE也没有指定FOR ALL TABLES,则publication刚开始时是一个空集合。如果想要后期再加入表,这种方式就很有用。

publication的创建并不会启动复制。它仅为未来的订阅者定义一种分区和过滤逻辑。

要创建publication,调用用户必须拥有当前数据库的CREATE特权(当然超级用户可以绕过这种检查)。

要将一个表加入到一个publication中,调用用户必须拥有该表上的拥有关系。FOR ALL TABLES子句要求调用用户是超级用户。

被加入到发布UPDATEDELETE操作的publication的表必须被定义为REPLICA IDENTITY。否则在那些表上不允许那些操作。

对于一个INSERT ... ON CONFLICT命令,publication将发布该命令实际导致的操作。因此根据实际的结果,它可能被发布为INSERT或者UPDATE,甚至可能都不会被发布。

COPY ... FROM命令被发布为INSERT操作。

DDL操作不会被发布。

示例

创建发布两个表中更改的publication:

CREATE PUBLICATION mypublication FOR TABLE users, departments;

创建发布所有表中所有更改的publication:

CREATE PUBLICATION alltables FOR ALL TABLES;

创建只发布一个表中的INSERT操作的publication:

CREATE PUBLICATION insert_only FOR TABLE mydata
    WITH (publish = 'insert');

兼容性

CREATE PUBLICATION是一种PostgreSQL扩展。

另见

ALTER PUBLICATION, DROP PUBLICATION