2012-03-22 154 views
1

我有一个问题,我还没有能够拿出解决方案。我有一个数据库(实际上有数千个客户站点),我想从周期性地提取数据。我想一次完成一个完整的数据提取(从表中选择*),然后只获取已更改的行。查找数据库表中已更改的记录

挑战在于大多数表中没有任何更新的日期列可用于约束SQL查询。我不能使用基于触发器的方法,也不能更改写入数据库的应用程序,因为它是另一个开发应用程序的组,并且它们已被备份。

我可能能够在做数据提取时写入数据库表,但不希望这样做。有没有人对我们如何能够做到这一点有任何想法?

+0

Go将自动增量id行添加到每个数据库中的每个表(真的)。 – 2012-03-22 02:50:12

+0

是的,我假设如果这是MySQL,那么几乎所有的表最有可能会自动增加ID列。如果是这样,我想你可以写一个脚本或手动标记你留下了什么ID。 – Gohn67 2012-03-22 02:55:47

+0

你的sql支持命令行查询的味道吗? – cctan 2012-03-22 07:07:00

回答

0

您将不得不以编程方式标记记录。我看到一个自动递增字段的建议,但只会得到新插入的记录。你将如何跟踪更新或删除的记录?

如果您只想新插入一个自动增量字段来完成这项工作;在随后的数据转储中,抓取自autoincrment字段的最后一个值以来的所有内容,然后重新编程当前值。

如果你想更新的最低限度,我可以看到是有一个last_update字段,并可能触发它的普及。如果last_update是最后一次数据转储,则抓取该记录。这将获得插入和更新,但不会删除。

如果您的RDBMS支持它并且NULL为last_update字段,您可以尝试类似''而不是'删除'触发器。在随后的数据转储中,将该字段为NULL的所有找到的字符串进行grap,然后删除它们。但会有这个问题(例如,如何停止应用程序看到他们的逻辑和物理删除之间)

最傻瓜证明方法,我可以看到的是历史(审核)表ASET和ECH变化被写入到其中的。然后你从那里选择你的数据转储。

顺便说一句,你只关心知道更新发生?如果发生2次(或更多次)更新,怎么办?历史记录表是我能看到你捕获这种情况的唯一方式。

+0

谢谢。我不能将触发器添加到这个数据库,并且写入数据库将是粗略的。自从我上次查询它以来,我只关心一行是否发生了变化。无论多少次更改或两次更改之间没有关系。 – 2012-03-22 18:47:37

+0

如果你有这个限制,我会考虑每次抓取一个完整的副本,并在你的最后做比较。然后你会发现更新和删除。 – Karl 2012-03-22 22:32:45

+0

谢谢,卡尔。这就是我们目前正在做的事情(在开发过程中更准确)。我所希望的是,有人有一个想法让我们更接近数据库本身,因此我们不需要每次都转移整个事情。 – 2012-03-22 23:57:44

0

这应隔离自上次备份以来发生更改的行。假设DestinationTable即使在关键字段上也是SourceTable的副本;如果不是的话,你可以列出重要的领域。

SELECT * FROM SourceTable 
EXCEPT 
SELECT * FROM DestinationTable