CREATE PUBLICATION — 定义一个新的publication
CREATE PUBLICATIONname
[ 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操作发布给订阅者。这个参数的值是用逗号分隔的操作列表。允许的操作是insert
、update
、delete
以及truncate
。默认是发布所有的动作,因此这个选项的默认值是'insert, update, delete, truncate'
。
如果既没有指定FOR TABLE
也没有指定FOR ALL TABLES
,则publication刚开始时是一个空集合。如果想要后期再加入表,这种方式就很有用。
publication的创建并不会启动复制。它仅为未来的订阅者定义一种分区和过滤逻辑。
要创建publication,调用用户必须拥有当前数据库的CREATE
特权(当然超级用户可以绕过这种检查)。
要将一个表加入到一个publication中,调用用户必须拥有该表上的拥有关系。FOR ALL TABLES
子句要求调用用户是超级用户。
被加入到发布UPDATE
或DELETE
操作的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扩展。