publication可以被定义在任何物理复制的主服务器上。定义有发布的节点被称为发布者。发布是从一个表或者一组表生成的改变的集合,也可以被描述为更改集合或者复制集合。每个发布都只存在于一个数据库中。
publication与模式不同,不影响表的访问。每个表可以添加到多个publication中(如果需要)。
publication目前只能包含模式中的所有表。对象必须显式添加,除非为ALL TABLES
创建了一个publication。
publication可以选择将它们产生的更改限制为INSERT
、UPDATE
、
DELETE
和TRUNCATE
的任意组合,类似于触发器如何由特定事件类型触发。
默认情况下,所有操作类型都会被复制。这些出版规范仅适用于DML操作;它们不影响初始数据同步副本。
(行过滤器对TRUNCATE
没有影响。请参见第 31.3 节)。
已发布的表必须配置一个副本标识,以便能够复制
UPDATE
和DELETE
操作,从而在订阅
方能够识别出需要更新或删除的适当行。默认情况下,如果存在主键,
则使用主键。另一个唯一索引(具有某些额外要求)也可以设置为副本
标识。如果表没有任何合适的键,则可以将其设置为副本标识
FULL
,这意味着整个行成为键。当指定副本标识
FULL
时,可以在订阅方使用索引来搜索行。候选索引
必须是btree、非部分的,并且最左侧的索引字段必须是引用已发布表列
的列(而不是表达式)。这些对非唯一索引属性的限制遵循了一些对主键
强制执行的限制。如果没有这样的合适索引,则在订阅方的搜索可能会非常
低效,因此副本标识FULL
应仅作为没有其他解决方案
时的后备选项。如果在发布方设置了FULL
以外的副本
标识,则在订阅方也必须设置一个由相同或更少列组成的副本标识。有关如
何设置副本标识的详细信息,请参见
REPLICA IDENTITY
。如果将没有副本标识的
表添加到复制UPDATE
或DELETE
操作的发布中,那么后续的UPDATE
或
DELETE
操作将在发布方引发错误。
INSERT
操作可以在没有任何副本标识的情况下继续进行。
每一个发布都可以由多个订阅者。
Publication通过使用CREATE PUBLICATION
命令创建并且可以在之后使用相应的命令进行修改或者删除。
表可以使用ALTER PUBLICATION
动态地增加或者移除。ADD TABLE
以及DROP TABLE
操作都是事务性的,因此一旦该事务提交,该表将以正确的快照开始或者停止复制。