Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
指定上载时应发送触发器操作。
st={ ON | OFF }; ...
SendTriggers={ ON | OFF }; ...
级联删除同样被视为触发器操作。
缺省值为 OFF。
如果两个预订都包含一个或多个相同的表,则必须使用相同的 SendTriggers 选项设置来同步这两个预订。
如果触发器操作是在同步的下载阶段中数据库发生更改时而触发的,则这些操作永远不能被同步,无论 SendTriggers 选项的值是什么。
当 SendTrigger 选项设置为 ON 时若要对触发器中的操作进行同步,该触发器中的操作必须发生在要同步的发布中的表上。导致触发器触发的基本操作不必也出现在发布中。
Dbmlsync 会合并发生在单行上的操作,但如果将 SendTrigger 操作设置为 ON,则还会发送在触发器中触发的所有操作,即使导致触发器触发的基本操作也被合并到另一操作中。
外键(ON DELETE CASCADE 和 ON UPDATE CASCADE)上的内置参照完整性操作被视为触发器操作,除非将 SendTrigger 选项设置为 ON,否则不会同步。不过,如果参照完整性操作发生在已处于上载流中的行上,则属于例外情况。在这种情况下,系统生成的触发器中的参照完整性操作会与已处于上载流中的行的状态合并,如以下示例中所示。
在此示例中,Parent 表和 Child 表之间存在外键,参照完整性操作为 ON DELETE CASCADE。
INSERT INTO Parent (pid, pname) values ( 100, 'Amy' ); INSERT INTO Child (cid, pid, cname) values ( 2000, 100, 'Alex' ); COMMIT; DELETE FROM Parent WHERE pid = 100; COMMIT;
从 Parent 表删除行 100 时,RI 操作也会从 Child 表删除行 2000,了解这一点非常重要。如果在此时运行 dbmlsync,则对 Parent 表的行 100 先 INSERT 再 DELETE,这会导致该行不能同步。然而,如果将 SendTrigger 选项设置为 OFF,则将发送插入到 Child 表的操作。在这种情况下,因为 dbmlsync 已将 Child 表的行 2000 添加到上载流中,对 Parent 表中行 100 的删除的参照完整性操作(删除 Child 表的行 2000)将与上载流中的现有行合并,这样会使任何一行都不会被同步,从而维护了两端数据的一致性。
以下 dbmlsync 命令行说明在启动 dbmlsync 时如何设置此选项:
dbmlsync -e "st=on"
以下 SQL 语句说明如何在数据库中存储此选项:
CREATE SYNCHRONIZATION SUBSCRIPTION TO sales_publication FOR ml_user1 OPTION st='on';