我有一个Sybase SQL Anywhere 11.0.1数据库,用于与Oracle Consolidated Database同步。
我知道SQL Anywhere数据库会跟踪对其所做的所有更改,以便它知道要与统一数据库同步的内容。我的问题是,是否有一个SQL命令会告诉您数据库是否有更改同步。
我有一个移动应用程序,我想在用户对需要同步的掌上电脑进行更改时随时向用户显示一个小旗。我可以创建另一个表来自己跟踪这些内容,但我更愿意ping数据库并询问它是否有需要同步的更改。
答案 0 :(得分:2)
没有什么可以自动告诉您有数据要同步。除了Ben的建议之外,另一个想法是查询远程数据库中的SYS.SYSSYNC表以了解是否可能有更改。以下语句返回一个结果集,该结果集显示上次同步的简单状态:
select ss.site_name, sp.publication_name, ss.log_sent,ss.progress
from sys.syssync ss, sys.syspublication sp
where ss.publication_id = sp.publication_id
and ss.publication_id is not null
and ss.site_name is not null
如果progress < log_sent
,则上次同步的状态未知。上次上载可能已应用或未应用于合并,因为上载已发送,但未从MobiLink服务器收到响应。在这种情况下,建议同步并不是一个坏主意。
如果progress = log_sent
,则最后同步成功。知道这一点,您可以检查db_property('CurrentRedoPos')
的值,它将返回远程数据库的当前日志偏移量。如果此值明显高于进度值,则自上次同步以来已对数据库应用了许多操作,因此很可能存在要同步的数据。有很多原因导致即使进度差异很大,db_property('CurrentRedoPos')
也可能导致没有实际数据需要同步。
sp_hook_dbmlsync_end
表值中的退出代码值为零时,可以通过跟踪#hook_dict
挂钩中的当前日志偏移来解决此问题。这将告诉您应用下载后数据库的日志偏移量,您现在可以将保存的值与当前日志偏移量进行比较。 我的解决方案并不理想。自己跟踪对同步表的更改是最好的解决方案,但我认为我可以提供一个可以满足您需求的替代方案,其优点是您不会对同步表上执行的每个操作触发额外操作。
答案 1 :(得分:1)
移动数据库无法跟踪上次同步的时间,MobiLink服务器会将所有这些信息保留在统一数据库的MobiLink表中。
由于同步仅传输必要的信息,因此您只需启动同步即可。如果没有任何内容可以同步,那么您的应用程序将使用非常少的数据。
作为旁注,SQL Anywhere有its own SO clone,由Sybase工程师监控。如果有人确切知道,那就是他们。
答案 2 :(得分:0)
从SQL Anywhere 17开始,SAP PM映射到包含TTRANSACTION_UPLOAD表的本地Sybase数据库,因此要确定是否需要同步,我们只需查询此表以查看是否有任何需要同步的记录&#39 ; d到HANA合并数据库。