将Envers添加到现有数据库

我在生产中有一个基于Hibernate的应用程序,并有一个大型数据库。 我需要在这个应用程序中向两个实体(两个表)添加审计,并且我决定和Envers一起去。

对于每个INSERT,UPDATE或DELETE,Envers会向实体的审计表添加一条新记录。

如果我从应用程序的开始获得Envers支持,那么在创建实体(INSERT)时将会填充审计表。

Envers文档非常薄,并没有提到将Envers添加到现有应用程序的任何内容。

如果我只是添加Envers支持并创建相应的审计表,它们将开始为空,因此,当我更新现有实体时,Envers会将记录添加到记录新值的审计表中,但是我将失去先前的值。

我应该如何将Envers支持添加到具有现有数据库的应用程序中?


目前没有内置的解决方案。

“正确”的方法是编写一个SQL脚本(或手动创建)一个“0”版本,以及为每个现有实体绑定到该版本的插入审计记录。

其实,这是一个非常常见的功能,所以如果你想贡献,这将是最受欢迎的!


您将需要手动插入。 就像是

INSERT INTO z_envers_revisions (ID, timestamp, user_id, user_name) values (1, round((sysdate - to_date('19700101','YYYYMMDD')) * 86400000) , 42, 'UserName');

INSERT INTO z_Table1(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table1;
INSERT INTO z_Table2(rev, revtype, id, description, name) select 1 as rev, 0 as revtype, id, description, name from Table2;

我在这里用我的审计表前缀来缩短它


就envers而言,基本用例是记录一个实体的完整审计(我们希望通过@Audited注释的参数)。 对于您提到的情况,可能会正确添加新实体,但对于现有的实体可能会带来问题,因为审计表中没有修订。

让我们借助场景来解决案例:

假设我们考虑的实体是用户 。 现在创建的表来观察历史记录,比方说users_audit 。 除此之外, Revinfo还将会观察并记录与特定记录相关的所有变化。

这个问题首先出现,因为每当有更新时,持久层都无法找到修订记录。 因此,为了解决这个问题,需要在表中存在所有现有的条目,并且不应该破坏使用revinfo表的外键映射。 因此,需要做两件事情:

  • 将临时值插入revinfo表中,以便rev可以充当外键
  • 将users表中的数据复制到users_audit表。
  • 示例Liquibase文件可以是这样的:

        CREATE TABLE `revinfo` (
          `rev` int(11) NOT NULL AUTO_INCREMENT,
          `revtstmp` bigint(20) DEFAULT NULL,
          PRIMARY KEY (`rev`)
        ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    
        INSERT INTO `revinfo` (`revtstmp`) select updated_at from users u;
    
        SET @position := 0;
    
        insert into users_audit (
        rev,
        revtype,
        id,
        name,
        type,
        mobile_number,
        password,
        parent_id,
        profile_image_uri,
        is_active,
        created_at,
        updated_at
        ) select @position := @position +1, 0,
        id,
        name,
        type,
        mobile_number,
        password,
        parent_id,
        profile_image_uri,
        is_active,
        created_at,
        updated_at from us
    
    链接地址: http://www.djcxy.com/p/12385.html

    上一篇: Adding Envers to an existing database

    下一篇: Confirm Box is not working while redirecting to other page in ASP.NET