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