我有一个问题,我还没有能够提出解决方案。我有一个数据库(实际上有数千个客户站点),我想定期提取数据。我想一次完整的数据提取(从表中选择*),然后只获取已更改的行。
挑战在于大多数表中没有任何更新的日期列可用于约束SQL查询。我不能使用基于触发器的方法,也不能更改写入数据库的应用程序,因为它是开发应用程序的另一个组,它们已经备份了。
我可以在进行数据提取时写入数据库表,但不希望这样做。有没有人对我们如何做到这一点有任何想法?
答案 0 :(得分:0)
您必须以编程方式标记记录。我看到了自动递增字段的建议,但只会获得新插入的记录。您将如何跟踪更新或删除的记录?
如果您只想重新插入一个自动增量字段来完成工作;在后续数据转储中,抓取自autoincrment字段的最后一个值以来的所有内容,然后重新计算当前值。
如果你想要更新,我可以看到的最小值是有一个last_update字段,可能是一个推广它的触发器。如果last_update稍后是最后一个数据转储,则抓取该记录。这将获得插入和更新,但不会删除。
如果你的RDBMS支持它,你可以尝试类似'而不是删除'的触发器,并将last_update字段置为NULL。在后续数据转储中,抓取此字段为NULL的所有反转,然后删除它们。但是这会有问题(例如,如何阻止应用程序在逻辑删除和物理删除之间看到它们)
我能看到的最简单的方法是历史(审计)表的一组,并且ech更改会写入它们。然后从那里选择数据转储。
那么你只关心知道更新发生了吗?如果发生2次(或更多)更新怎么办?历史表是我可以看到您捕获此场景的唯一方法。
答案 1 :(得分:0)
这应该隔离自上次备份以来已更改的行。假设DestinationTable是SourceTable的副本,即使在关键字段上也是如此;如果没有,你可以列出重要的字段。
SELECT * FROM SourceTable
EXCEPT
SELECT * FROM DestinationTable