10

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

  1. 节省
  2. 删除

对于基础对象,我将更改存储在 Audit-AuditTrail (Mast-Det) 表中,用于字段更改。等使用一些方法服务调用。

您如何在 OOP 代码中实施审计跟踪?请分享您的见解?有什么图案之类的吗?最佳实践等?另一件事是如何在运行单元测试时禁用审计,因为我不需要审计它们,但因为基础对象有代码。

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

4

7 回答 7

8

如果可以的话,数据库触发器是首选的方式。

但是,最近我不得不在客户端代码中执行此操作,我最终编写了一个类,该类在打开对象进行编辑时创建了对象的深层(值)副本,并在保存时比较了两个对象(使用 ToString()仅)并将任何更改写入审计表。

编辑:我在每个我想考虑审计的属性上都有一个 [Audit] 属性,并使用反射来查找它们,使得该方法不特定于被审计的对象。

于 2008-09-29T11:42:28.550 回答
3

我不知道它是否会与您的 ORM 无缝匹配,但我为 ERP 应用程序使用了时间点数据库设计,并且非常推荐它。您会自动从此架构中获得历史记录和审计,以及其他好处。

于 2008-09-29T16:17:42.303 回答
1

如果您创建一组用于与数据库交互的 DAO(数据访问对象),我更多地来自 SW 端而不是 DB 端。然后,我会将审计功能插入到需要跟踪的 DAO 中的相应功能中。

数据库触发器解决方案也是可行的,这取决于您喜欢将功能放在数据库中还是代码中

有很多 ORM(对象关系映射)工具可以为您创建 DAO 层。

于 2008-09-29T12:25:09.587 回答
1

我已经在 Hibernate(另一个 ORM)中使用会话拦截器完成了这项工作。这样,审计代码与您的代码是分开的。

于 2008-12-23T05:40:23.003 回答
1

我们使用 AOP(aspectJ 实现)实现了类似的解决方案。使用这个特定的点可以被捕获并且可以执行特定的操作。

这可以在我们喜欢的时候插入和关闭。

如果您真的想在应用程序层中执行此操作,我建议您这样做。

希望能帮助到你..

于 2008-11-30T14:13:20.173 回答
0

我知道这不能回答您的问题,但为了记录,我更喜欢在数据库中处理这种类型的审计逻辑。

于 2008-09-29T11:18:35.050 回答
0

我们有一个表,所有审计跟踪条目都存储在其中。每个表上都有一个数据库触发器(它由存储过程放在那里,但这与这个答案无关)。更改值时,旧值将存储在审计跟踪中。我们的有点复杂,因为我们还有一个查找表,其中包含我们拥有的每个表的列表,另一个表包含每个表的每个字段。这使我们可以根据第一列中该表的 ID 在哪个表中查找审计跟踪中的条目。然后我们也可以根据第二个表的 ID 确切地知道我们要查找的字段。这使我们不必为表名和字段名存储字符串。为了显示它,我们的网格在删除按钮旁边有一个“审计跟踪”按钮。这将打开一个带有该记录历史的弹出网格。我们使用剑道网格,但这些实现都不是必需的。弹出窗口是引导弹出窗口。

于 2020-03-28T22:50:50.613 回答