2011-01-10 91 views
3

我正在使用Zend框架开发基于Web的应用程序。跟踪数据库列值更改

我正在寻找一种方式来保持一堆列所做的更新史。

用例: 用户可以与5个属性添加项目。用户被允许更新5个属性。我需要跟踪他对这5个属性所做的所有更新。

在路上我还以为物添加新表命名日志存储的旧值,新值,列名,ITEMID和时间戳。

这样做的最好方法是什么?有没有现有的方法/选项/例子?

谢谢,

回答

3

你可能要查找的是审计日志。您可以在MySQL数据库上使用触发器创建一个。

如何做到这一点的一个例子是在这里:http://ronaldbradford.com/blog/auditing-your-mysql-data-2008-07-15/

在下面你您的评论补充说,该数据库没有“固定”。在这种情况下,您必须将任何更改复制到表中,以便将这些更改应用到审计表,以便将任何新添加的列也添加到日志中。

你可以考虑在应用程序中记录此(为您选择了这个问题的标签似乎暗示) - 但请记住,这意味着有可能的情况下你的日志不提供完整的答案。触发器,存储过程和数据库中的任何手动干预都不会被记录下来,所以如果您选择沿着这条路径走,请小心。

+0

我的数据库没有修复。这会成为一个问题吗?这可以使用其他然后mysql? – panxpress 2011-01-10 20:06:18

+0

如果通过修正您的意思是列将被改变(基于用户在应用程序中执行操作)..然后是。这将是一个问题。是的,其他数据库(PostGres,我知道的MSSQL,其他很可能)支持这一点。 – kander 2011-01-10 20:12:08

1

触发器是做审计的最常见方式,捕捉到什么做是否从用户界面或其他地方做的唯一真正可靠的方法。他们确实依据数据库的不同而改变。如果您知道您将支持的数据库后端的可能类型,则可以为每个后端编写单独的触发器。

如果你必须处理这个没有触发,那么你最好的选择是有写入审计表,以及使更新变化的过程。它可能足够复杂以保证Zend框架所调用的存储过程,而不是依赖框架本身来执行。 (我不是familair与Zend,所以我不知道这是有可能成立,我知道一个存储过程可以处理这个问题。)

0

我刚刚创建了一个新的表称之为Comp_Hist_Log,然后定义在 旧数据之前UPDATE钩 $ OLDDATA = $阵列(“fieldname1”,“fieldname2”)

然后在AFTER_UPDATE钩在我的数据库贵钩文件..添加此代码

SQL(“INSERT INTO Comp_Hist_LogCom_Rec_Idold_datanew_dataChangedDateChangedBy

VALUES( '{$数据[' RECORD_ID ']}', '{$ OLDDATA}', '{$ messageData}','{$ data ['LastUpdated']}','{$ memberInfo ['username']}')“,$ eo); 返回TRUE;

希望它有助于..它确实有效。