我正在使用Zend框架开发基于Web的应用程序。
我正在寻找一种方法来保存对一堆列的更新历史记录。
用例: 用户可以添加具有5个属性的项目。允许用户更新5个属性。我需要跟踪他对这5个属性所做的所有更新。
我想到的方法是添加一个名为log的新表,它存储旧值,新值,列名,itemID和时间戳。
最好的方法是什么?是否有现有的方法/选项/示例?
谢谢,
答案 0 :(得分:4)
您可能正在寻找的是审核日志。您可以在MySQL数据库上使用Triggers创建一个。
如何执行此操作的示例如下:http://ronaldbradford.com/blog/auditing-your-mysql-data-2008-07-15/
在下面的评论中,您添加了数据库未“修复”。在这种情况下,您必须将任何更改复制到表中,以便将它们应用于审计表,以便将任何新添加的列添加到日志中。
您可以考虑在应用程序中记录此内容(因为您为此问题选择的标记似乎是建议) - 但请记住,这意味着可能存在日志无法提供完整答案的情况。数据库中的触发器,存储过程和任何手动干预都不会被记录...因此,如果您选择沿着这条路走下去,请务必小心。
答案 1 :(得分:2)
触发器是执行审核的最常用方式,也是捕获所做内容的唯一真正可靠的方法,无论是从用户界面还是其他地方完成。它们确实根据数据库的不同而有所不同。如果您知道可支持的数据库后端的可能类型,则可以为每个后端编写单独的触发器。
如果你必须在没有触发器的情况下处理这个问题,那么最好的办法是让一个进程写入审计表并更新更新。它可能很复杂,足以保证Zend框架调用的存储过程,而不是依赖于框架本身。 (我不是Zend的家庭,所以我不知道这是否可以设置,我知道存储过程可以处理这个。)
答案 2 :(得分:0)
这是一个更好的.. 见Pop On the Audit Trail
答案 3 :(得分:0)
我刚刚创建了一个名为Comp_Hist_Log的新表,然后定义了旧数据 BEFORE UPDATE钩子 $ oldData = $ array('fieldname1','fieldname2')
然后在我的数据库gui hook文件中的AFTER_UPDATE钩子中..我添加了这段代码
sql(“INSERT INTO Comp_Hist_Log
(Com_Rec_Id
,old_data
,new_data
,ChangedDate
,ChangedBy
)
VALUES('{$ data ['Record_Id']}','{$ oldData}','{$ messageData}','{$ data ['LastUpdated']}','{$ memberInfo ['username ']}')“,$ eo); 返回TRUE;
希望它有所帮助..它确实有效。