当前位置: 首页 > 知识库问答 >
问题:

将enver添加到现有数据库

束帅
2023-03-14

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

对于每次插入、更新或删除,Envers都会向实体的审核表中添加一条新记录。

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

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

如果我简单地添加Envers支持并创建相应的审计表,它们将开始为空,因此当我更新现有实体时,Envers将向审计表添加记录新值的记录,但我将失去以前的值。

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

共有3个答案

易飞文
2023-03-14

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

让我们在一个场景的帮助下解决这个问题:

假设我们考虑的实体是用户。现在创建用来观察历史的表,比方说,是users\u audit。除此之外,revinfo还将对给定记录的所有变化进行观察和记录。

问题首先出现了,因为每当有更新时,持久化层都无法找到修订记录。因此,要修复它,所有现有条目都需要存在于表中,并且与revinfo表的外键映射不应中断。因此,需要做两件事:

  1. 在revinfo表格中插入临时值,以便rev可以用作外键
  2. 将数据从users表复制到users\u 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
梁丘霖
2023-03-14

您需要手动插入。差不多

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;

我在我的审计表前面加了一个z,以缩短它

越朗
2023-03-14

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

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

事实上,这是一个非常普遍要求的功能,所以如果你想贡献,它将是最受欢迎的!

 类似资料:
  • 问题内容: 我试图弄清楚如何将以下数据添加到我的json对象。有人可以告诉我该怎么做。 网站范例 我的JSONObject需要合并以上示例。 问题答案: 为了得到这个结果: 拥有与以下相同的数据: 您可以使用以下代码:

  • 我有一个现有的Solr设置,运行在一个独立的Solr实例上。我被要求为此设置添加弹性和高可用性。因此,我想将复制添加到我的设置中,我认为SolrCloud是一种方式? 我已经在SolrCloud wiki上浏览了演示。然而,我不确定如何将现有的Solr实例添加到ZooKeeper,然后再添加一些节点以供复制。这是否可以不重新膨胀? 维基上说 注意:如果不使用示例启动solr,请确保在创建集合之前将

  • 我的数据记录如下所示 我想在forloop中向我的数据表添加新行(不是循环现有的数据表) 但这种方法行不通。如何向现有数据目录添加新行?

  • 我有一个名为的现有表。在这个表中,我有5列: persionId 人名 PMid 描述 Pamt 创建此表时,我将和设置为主键。 我现在想在主键中再包含一列——PMID。我如何编写一个语句来做到这一点?(表中已经有1000条记录了)

  • 问题内容: 如何添加到MySQL表的现有列? 问题答案: 我认为您想按照命令中的说明进行操作。可能是这样的: 在上面运行之前,请确保该列具有主索引。

  • 对于如何向已经存在的Lucene索引添加方面,我有点困惑。 我有一个使用Lucene 3.1创建的Lucene索引(创建时没有任何方面)。 我已经查看了Lucene文档中的facet,在那里他们向您展示了如何从头创建一个带有facet的索引,也就是说,您创建一个新的Lucene对象,使用分类工具向其添加facet信息(类别),然后在Lucene索引中编写该文档(使用)这还将向分类法索引添加额外数据