我只是想知道是否存在允许您对行级内容进行版本控制的存储引擎类型。例如,如果我有一个带ID的简单表,名称,值和ID是PK,我可以看到行354以(354,“zak”,“test”)v1开始,然后被更新为(354, “zak”,“这是值的第2版”)v2,并且可以在行上看到更改历史记录,例如选择历史记录(值),其中ID = 354。
这是一种深奥的东西,但每次改变时都必须继续编写这些单独的历史表和函数...
答案 0 :(得分:3)
您似乎正在寻找更多审计功能。 Oracle和其他几个DBMS具有完整的审计功能。但是许多DBA仍然最终实现基于触发器的行审计。这一切都取决于你的需求。
Oracle支持几种易于从命令行配置的审核粒度。
我看到你被标记为MySQL,但询问了任何存储引擎。无论如何,其他答案都说同样的事情,所以我要删除这篇文章,原来它是关于闪回功能。
答案 1 :(得分:3)
显然你真的在使用MySQL解决方案,所以这可能对你没有多大帮助,但是Oracle有一个名为Total Recall(更正式的Flashback Archive)的功能,它可以自动完成你当前手动滚动的过程。存档是一组压缩表,它们自动填充更改,并使用简单的AS OF
语法进行查询。
自然是甲骨文他们收取费用:它需要企业版之上的额外许可,唉。 Find out more (PDF).
答案 2 :(得分:1)
您可以使用触发器实现类似的行为(搜索“触发器以捕获所有数据库更改”) - 特别是如果它们实现了SQL92 INFORMATION_SCHEMA
。
否则我同意mrjoltcola
编辑:我提到MySQL和触发器的唯一问题是(截至我下载的最新社区版本)它要求用户帐户具有SUPER
权限,这可能会让事情变得有点难看< / p>
答案 3 :(得分:1)
Oracle和Sql Server都调用此功能Change Data Capture
。目前没有MySql的等价物。
答案 4 :(得分:1)
我认为Big table(谷歌数据库引擎)就是这样的:它将时间戳与行的每次更新相关联。
也许您可以试用Google App Engine。
有一篇Google论文解释how Big Table works。
答案 5 :(得分:1)
CouchDB对每次更改都有完整版本,但它是NOSQL世界的一部分,所以可能是你正在做的一个非常疯狂的转变。
答案 6 :(得分:1)
google的bigtable上的wikipedia article提到它允许通过向表格添加时间维度进行版本控制:
每张桌子都有多个尺寸 (其中一个是时间领域, 允许版本化。)
还有一些关于bigtable-type dbms的非google实现的链接。
答案 7 :(得分:1)
这本书Refactoring Databases对此事有一些见解。
但它也指出目前还没有真正的解决方案,只有仔细地进行更改并手动管理它们。
答案 8 :(得分:0)
对此的一个近似是时态数据库 - 它允许您在过去的不同时间查看整个数据库的状态。我不确定完全回答你的问题;它不允许您在时间t1看到第1行的内容,同时让您在不同的时间t2查看第2行的内容。
答案 9 :(得分:0)
“这是一种深奥的东西,但每次做出改变时都必须继续编写这些单独的历史表和函数......”
我不会把审计线索(这显然是你所说的)称为“深奥的东西”......
并且:数据库更新的历史与现实的历史之间仍然存在差异。历史数据库表应该用于反映现实的历史, NOT 数据库更新的历史。
数据库更新的历史记录已由DBMS在其日志和日志中保留。如果有人需要查询数据库更新的历史记录,那么他/她应该真正使用日志和日志,而不是任何类型的应用程序级构造,从不提供足够的保证它反映< em>所有更新。