我有一个 Sybase SQL Anywhere 11.0.1 数据库,用于与 Oracle 整合数据库同步。
我知道 SQL Anywhere 数据库会跟踪对其所做的所有更改,以便知道与统一数据库同步的内容。我的问题是是否有一个 SQL 命令可以告诉您数据库是否有要同步的更改。
我有一个移动应用程序,我想在用户对需要同步的手持设备进行更改时向他们显示一个小标志。我可以自己创建另一个表来跟踪这些内容,但我更愿意 ping 数据库并询问它是否有需要同步的更改。
我有一个 Sybase SQL Anywhere 11.0.1 数据库,用于与 Oracle 整合数据库同步。
我知道 SQL Anywhere 数据库会跟踪对其所做的所有更改,以便知道与统一数据库同步的内容。我的问题是是否有一个 SQL 命令可以告诉您数据库是否有要同步的更改。
我有一个移动应用程序,我想在用户对需要同步的手持设备进行更改时向他们显示一个小标志。我可以自己创建另一个表来跟踪这些内容,但我更愿意 ping 数据库并询问它是否有需要同步的更改。
没有什么自动告诉您有数据要同步。除了 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
零时,可以通过跟踪挂钩中的当前日志偏移量来解决此问题。这将告诉您应用下载后数据库的日志偏移量,您现在可以将保存的值与当前日志偏移量进行比较。我的解决方案并不理想。自己跟踪同步表的更改是最好的解决方案,但我认为我可以提供一个可能满足您需求的替代方案,其优点是您不会对同步表上执行的每个操作触发额外操作。
移动数据库不跟踪上次同步的时间,MobiLink 服务器将所有这些信息保存在统一数据库的 MobiLink 表中。
由于同步只传输必要的信息,您可以简单地启动同步。如果没有要同步的内容,那么您的应用程序将使用很少的数据。
附带说明一下,SQL Anywhere 有自己的 SO 克隆,由 Sybase 工程师监控。如果有人确切知道,那就是他们。
从 SQL Anywhere 17 开始,SAP PM 映射到包含 TTRANSACTION_UPLOAD 表的本地 Sybase 数据库,因此要确定是否需要同步,我们只需查询该表以查看它是否有任何需要同步到 HANA 的记录合并数据库。