14

我只是想知道是否存在允许您对行级内容进行版本控制的存储引擎类型。例如,如果我有一个带有 ID、名称、值和 ID 是 PK 的简单表,我可以看到第 354 行以 (354, "zak", "test")v1 开始,然后更新为 (354, "zak", "this is version 2 of the value")v2 ,并且可以在行上看到更改历史记录,例如选择历史记录(值),其中 ID = 354。

这是一种深奥的事情,但每次进行更改时都必须继续编写这些单独的历史表和函数......

4

10 回答 10

3

看来您正在寻找更多的审计功能。Oracle 和其他几个 DBMS 具有完整的审计功能。但许多 DBA 最终仍会实施基于触发器的行审计。这一切都取决于您的需求。

Oracle 支持多种粒度的审计,这些粒度很容易从命令行进行配置。

我看到您标记为 MySQL,但询问了任何存储引擎。无论如何,其他答案都在说同样的事情,所以我要删除这篇文章,因为它最初是关于闪回功能的。

于 2010-03-23T20:52:16.537 回答
3

显然,您确实在使用 MySQL 解决方案,因此这可能对您没有多大帮助,但 Oracle 有一个称为 Total Recall(更正式的 Flashback Archive)的功能,它可以自动执行您当前正在手动处理的过程。存档是一组压缩表,这些表会自动填充更改,并且可以使用简单的AS OF语法进行查询。

自然是 Oracle,他们为此收费:唉,它需要在企业版之上的额外许可证。 了解更多 (PDF)。

于 2010-03-23T20:58:16.867 回答
1

您可以使用触发器实现类似的行为(搜索“捕获所有数据库更改的触发器”) - 特别是如果它们实现 SQL92 INFORMATION_SCHEMA

否则我会同意 mrjoltcola

编辑:我要提到的关于 MySQL 和触发器的唯一问题是(截至我下载的最新社区版本)它要求用户帐户具有SUPER特权,这会使事情变得有点难看

于 2010-03-23T20:55:07.153 回答
1

Oracle 和 Sql Server 都调用了这个特性Change Data Capture。目前没有适用于 MySql 的等价物。

于 2010-03-23T21:19:25.390 回答
1

我认为 Google DB 引擎 Big table 做了类似的事情:它将时间戳与行的每次更新相关联。

也许你可以试试 Google App Engine。

有一篇 Google 论文解释了 Big Table 的工作原理

于 2010-03-23T21:20:55.947 回答
1

CouchDB 对所做的每一项更改都有完整的版本控制,但它是 NOSQL 世界的一部分,因此与您目前所做的相比,这可能是一个非常疯狂的转变。

于 2010-03-23T21:22:53.540 回答
1

google's bigtable 上的维基百科文章提到它允许通过向表格添加时间维度来进行版本控制:

每个表都有多个维度(其中一个是时间字段,允许版本控制)。

那里也有一些大表类型 dbms 的非谷歌实现的链接。

于 2010-03-23T21:25:33.837 回答
1

Refactoring Databases一书对这个问题有一些见解。

但它也指出目前没有真正的解决方案,除了仔细进行更改并手动管理它们。

于 2010-03-23T22:21:21.317 回答
0

对此的一种近似是临时数据库——它允许您查看整个数据库在过去不同时间的状态。不过,我不确定这是否完全回答了您的问题;它不允许您在时间 t1 查看第 1 行的内容,同时让您在单独的时间 t2 查看第 2 行的内容。

于 2010-03-23T21:07:11.350 回答
0

“这是一种深奥的事情,但每次进行更改时都必须继续编写这些单独的历史表和函数......”

我不会将审计追踪(这显然是你所说的)称为“深奥的东西”......

而且:数据库更新的历史和现实的历史还是有区别的。历史数据库表应该真正用来反映现实的历史,而不是数据库更新的历史。

The history of database updates is already kept by the DBMS in its logs and journals. If someone needs to inquire the history of database upates, then he/she should really resort to the logs and journals, not to any kind of application-level construct that can NEVER provide sufficient guarantee that it reflects ALL updates.

于 2010-03-23T23:42:46.953 回答