如何比较表中的数据(操作前后)?

Posted

技术标签:

【中文标题】如何比较表中的数据(操作前后)?【英文标题】:How to compare data in table (before and after an operation)? 【发布时间】:2011-09-12 09:53:41 【问题描述】:

是否有任何免费工具或方法可以了解数据库表中发生了什么变化?

【问题讨论】:

默认情况下没有办法做到这一点。查看我对最近类似问题的回答:***.com/questions/7337148/… 【参考方案1】:

你可以在更新前复制一份

CREATE TABLE t2 AS SELECT * FROM t1

运行更新

然后显示差异

使用它来显示更新:

SELECT * FROM t1
MINUS
SELECT * FROM t2

用它来显示删除:

SELECT * FROM t2
WHERE NOT EXISTS(SELECT 1 FROM t1 WHERE t1.primary_key = t2.primary_key)

最后这是检查记录总数是否相同

SELECT count(*) FROM t1

SELECT count(*) FROM t2

注意:如果有其他会话更新 t1,则可能很难发现您的更新。

【讨论】:

这不会显示任何已删除的记录,如果这是操作的话。【参考方案2】:

确实应该避免触发,但是...

如果您在非生产环境中,您可以设置触发器来执行对新表的日志记录。您需要 5 个字段,如下所示:

LogTime DateTime;
Table   Varchar2(50); -- Table Name
Action  Char;         -- Insert, Update or Delete
OldRec  Blob;         -- Concatenate all your field Values
NewRec  Blob;         -- Ditto

这样做的好处是您可以将给定时间跨度的所有 OldRecs 和 NewRecs 选择到文本文件中。比较工具会帮助您突出显示您的更改。

有什么帮助吗?

【讨论】:

【参考方案3】:

我过去曾非常成功地将Toad 用于 mysql(用于模式和数据)。我看到它也与 Oracle 兼容。

【讨论】:

【参考方案4】:

试试liquibase,它提供了数据库的版本控制机制。

【讨论】:

以上是关于如何比较表中的数据(操作前后)?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较同一表中的两行并使用存储过程返回数据作为响应

优化比较两个 MySQL 大表中的数据

在 SQL 中排序时如何比较同一表中的两行?

如何通过比较两个表中的两列来更新表中的列

如何比较不同表中的两个INTEGER列?

如何将此表中的数据作为列表提交到asp.net mvc中的操作? [关闭]