我需要在我的对象上实现添加/编辑/删除的审计跟踪,我正在使用ORM(XPO)来定义我的对象等。我实现了一个在
上触发的审计跟踪对象在基础对象中,我将更改存储在Audit-AuditTrail(Mast-Det)表中,以进行字段更改。使用一些叫做的方法服务。
如何在OOP代码中实现审计跟踪?请分享您的见解?任何模式等?最佳做法等?另一件事是如何在运行单元测试时禁用审计,因为我不需要审计它们,但是因为基础对象有代码。
对象(编辑/添加/ del)的更改以及需要审核的字段更改
答案 0 :(得分:7)
如果可以的话,数据库触发器是首选的方式。
然而,最近我必须在客户端代码中执行此操作,最后我编写了一个类,该对象在打开进行编辑时创建了对象的深(值)副本,比较了两个对象的保存时间(使用仅限ToString()并将任何更改写入审计表。
编辑:我在每个属性上都有一个[Audit]属性,我想考虑审核,并使用反射来查找它们,使得该方法对于被审核的对象不具体。
答案 1 :(得分:3)
我不知道它是否适合您的ORM,但我使用Point-in-Time数据库设计用于ERP应用程序并且真的推荐它。您可以自动从此体系结构中获取历史记录和审核,以及其他好处。
答案 2 :(得分:1)
如果你创建了一组用于与数据库交互的DAO(数据访问对象),那么我更多地来自SW侧的数据库端。然后,我将审计功能插入到需要跟踪的DAO中的相应功能中。
数据库触发器解决方案也是可行的,它取决于您在数据库或代码中放置功能的位置
有很多ORM(对象关系映射)工具可以为您创建DAO层。
答案 3 :(得分:1)
我们使用AOP(aspectJ实现)实现了类似的解决方案。可以捕获使用此特定点并执行特定操作。
我们喜欢的时候可以插上电源插上电源。
如果您真的想在应用层中执行此操作,我建议您这样做。
希望有所帮助......
答案 4 :(得分:0)
我知道这不能回答你的问题,但是为了记录,我更喜欢在数据库中处理这种类型的审计逻辑。
答案 5 :(得分:0)
我在Hibernate(另一个ORM)中使用Interceptor for Session完成了这个。这样,审计代码就会与您的代码分开。
答案 6 :(得分:0)
我们有一个表,所有审计跟踪条目都存储在其中。每个表上都有一个数据库触发器(它由存储过程放置在该表中,但与该答案无关)。更改值后,旧值将存储在审核跟踪中。我们的表有点复杂,因为我们还有一个查找表,其中包含我们拥有的每个表的列表,以及另一个表,其中包含每个表的每个字段。这使我们可以根据第一列中该表的ID在该表中查找该表中的条目。然后,我们还根据第二张表的ID确切地知道我们要查找的字段。这使我们不必为表名和字段名存储字符串。为了显示它,我们的网格在删除按钮旁边有一个“审核线索”按钮。这将打开一个带有该记录的历史记录的弹出网格。我们使用剑道网格,但是不需要任何实现。弹出窗口是引导弹出窗口。