在java中保存表的历史记录

时间:2011-03-29 07:29:33

标签: java audit-trail

如果用户在该表上插入,更新和删除,我需要Java中的示例程序来保存表的历史记录。有人可以帮忙吗?

提前致谢。

11 个答案:

答案 0 :(得分:3)

如果您正在使用Hibernate,则可以使用Envers来解决此问题。

答案 1 :(得分:1)

您有两种选择:

  1. 让数据库使用触发器自动处理。我不知道你正在使用什么数据库,但它们都支持你可以使用的触发器。
  2. 在程序中编写代码,在插入,更新和删除用户时执行类似操作。
  3. 就个人而言,我更喜欢第一种选择。它可能需要较少的维护。您可能有多个地方更新用户,所有这些地方都需要代码来更新另一个表。此外,在数据库中,您可以使用更多选项来指定所需的值和完整性约束。

答案 2 :(得分:0)

好吧,我们通常有自己的历史表,(大多数)看起来像原始表。由于我们的大多数表已经具有创建日期,修改日期和相应的用户,因此我们需要做的就是将数据集从实时表复制到历史表,创建日期为now()

我们正在使用Hibernate,所以这可以在拦截器中完成,但也可能有其他选项,例如某些数据库触发器执行脚本等

答案 3 :(得分:0)

这是一个Java问题?

这应该在数据库部分中移动。

您需要创建历史记录表。然后在原始表上创建数据库触发器,“在插入或更新之前创建或替换触发器,或者在每个行的表上删除....”

答案 4 :(得分:0)

我认为这可以通过在sql-server中创建一个触发器来实现。 您可以按如下方式创建TRIGGER:

语法:

  

CREATE TRIGGER trigger_name   {BEFORE | AFTER} {INSERT |更新|   DELETE} ON table_name FOR EACH ROW   triggered_statement

你必须在执行操作之前创建2个触发器,在执行操作之后创建另一个触发器。 否则它也可以通过代码实现,但是在批处理的情况下处理代码会有点繁琐。

答案 5 :(得分:0)

你应该尝试使用触发器。您可以拥有一个单独的表格(您需要保留历史记录的表格的完整副本)。

然后,在主表上的每次插入/更新/删除后,都会通过触发器更新此表。

然后,您可以编写Java代码以从第二个历史记录表中获取这些更改。

答案 6 :(得分:0)

我认为您可以使用底层数据库的重做日志来跟踪所执行的操作。是否有任何特别的理由去参加该计划?

答案 7 :(得分:0)

您可以尝试从表中创建说明对象列表(假设您有数据对象)。这将允许您循环列表并与表中的当前数据进行比较?然后,您将能够查看是否发生了任何更改。

您甚至可以使用包含枚举器的对象创建另一个列表,该枚举器为您提供操作(DELETE,UPDATE,CREATE)以及新数据。

之前没有这样做,只是一个想法。

答案 8 :(得分:0)

与@Ashish提到的一样,触发器可用于插入单独的表 - 这通常称为审计跟踪表审计日志表

下面是通常在此类审计跟踪表中定义的列:'Action'(插入,更新,删除),tablename(插入/删除/更新它的表),key(该表的主键 on需要基础),时间戳(此操作完成的时间)

在整个交易完成后,最好是审计日志。如果不是,如果异常被传递回代码端,则需要单独调用更新审计表。希望这会有所帮助。

答案 9 :(得分:0)

如果您正在讨论db表,您可以在db中使用任一触发器或在应用程序中添加一些额外的代码 - 可能使用方面。如果您使用的是JPA,则可以使用实体侦听器或执行一些额外的逻辑,为DAO对象添加一些方面,并将特定方面应用于对需要维护历史数据的实体执行CRUD的所有DAO。如果您的DAO对象是无状态bean,您可以使用Interceptor来实现在其他情况下使用java代理功能,cglib或其他可能为您提供方面功能的库。如果您使用的是Spring而不是EJB,则可以在应用程序上下文配置文件中建议您的DAO。

答案 10 :(得分:0)

触发器不可建议,当我将审计数据存储在文件中时,我没有使用数据库...我的建议是创建表"审计"并在servlet的帮助下编写java代码,并将数据存储在文件或数据库或其他数据库中......