如何实现对象的审计跟踪(编程)?

时间:2008-09-29 11:16:08

标签: c# logging object audit

我需要在我的对象上实现添加/编辑/删除的审计跟踪,我正在使用ORM(XPO)来定义我的对象等。我实现了一个在

上触发的审计跟踪对象
  1. OnSaving
  2. OnDeleting
  3. 在基础对象中,我将更改存储在Audit-AuditTrail(Mast-Det)表中,以进行字段更改。使用一些叫做的方法服务。

    如何在OOP代码中实现审计跟踪?请分享您的见解?任何模式等?最佳做法等?另一件事是如何在运行单元测试时禁用审计,因为我不需要审计它们,但是因为基础对象有代码。

    对象(编辑/添加/ del)的更改以及需要审核的字段更改

7 个答案:

答案 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确切地知道我们要查找的字段。这使我们不必为表名和字段名存储字符串。为了显示它,我们的网格在删除按钮旁边有一个“审核线索”按钮。这将打开一个带有该记录的历史记录的弹出网格。我们使用剑道网格,但是不需要任何实现。弹出窗口是引导弹出窗口。