You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Envers审计数据迁移至RavenDB 4并修改修订时间戳

解决RavenDB迁移中替换修订时间戳的方案

嘿,针对你从SAP SQLAnywhere + NHibernate Envers迁移到RavenDB 4,还要把Envers的审计时间戳替换掉Raven默认迁移时间的需求,我整理了几个可行的方案,都能避开创建遗留集合或额外元数据的问题:

方案1:插入修订时直接设置原始时间戳(推荐)

RavenDB的修订记录本质上是存储在@revisions系统集合中的文档,你可以用低级文档API直接插入这些修订,同时手动指定元数据里的@last-modified字段为Envers的原始时间戳。这样不需要后续补丁,一步到位。

举个C#代码示例:

// 从Envers获取单条审计记录
var enversAudit = FetchEnversAuditRecord();
// 对应RavenDB中目标实体的ID
var targetDocId = enversAudit.EntityUniqueId;
// 用Envers的修订号作为Raven的修订编号(确保唯一递增)
var revisionNumber = enversAudit.RevisionId;

// 把Envers中的实体快照转换成Raven能识别的格式(比如JObject)
var revisionContent = JObject.Parse(enversAudit.EntitySnapshotJson);

// 构建修订记录的元数据,核心是设置原始时间戳
var revisionMetadata = new MetadataDictionary
{
    ["@last-modified"] = enversAudit.RevisionTimestamp, // Envers的原始时间
    ["@revision"] = revisionNumber,
    ["@collection"] = "YourTargetEntityCollection", // 目标实体所属的集合名
    ["@document-id"] = targetDocId // 关联到目标实体的ID
};

// 用低级API插入修订记录
session.Advanced.PutDocument(
    $"@revisions/{targetDocId}/{revisionNumber}",
    revisionMetadata,
    revisionContent
);

方案2:补丁已插入的修订记录的时间戳

如果已经按原步骤插入了修订记录(此时时间戳是迁移时间),可以通过补丁操作修改对应修订文档的元数据,替换成原始时间戳。这种方式适合已经完成部分迁移的场景:

var enversAudit = FetchEnversAuditRecord();
// 拼接出该修订记录在Raven中的文档ID
var revisionDocId = $"@revisions/{enversAudit.EntityUniqueId}/{enversAudit.RevisionId}";

// 补丁元数据,替换时间戳
session.Advanced.PatchMetadata(revisionDocId, metadata => 
    metadata["@last-modified"] = enversAudit.RevisionTimestamp
);

更优迁移方式:批量插入提升性能

如果你的审计数据量很大,推荐用RavenDB的BulkInsert API批量处理,既高效又能一次性设置好原始时间戳:

using (var bulkInsert = documentStore.BulkInsert())
{
    foreach (var enversAudit in FetchAllEnversAuditRecords())
    {
        var revisionDocId = $"@revisions/{enversAudit.EntityUniqueId}/{enversAudit.RevisionId}";
        var revisionMetadata = new MetadataDictionary
        {
            ["@last-modified"] = enversAudit.RevisionTimestamp,
            ["@revision"] = enversAudit.RevisionId,
            ["@collection"] = "YourTargetEntityCollection",
            ["@document-id"] = enversAudit.EntityUniqueId
        };

        bulkInsert.Put(revisionDocId, revisionMetadata, JObject.Parse(enversAudit.EntitySnapshotJson));
    }
}

注意事项

  • 确保Envers的修订号是唯一且递增的,避免和RavenDB自动生成的修订号冲突;
  • @collection字段必须和目标实体在RavenDB中的集合名称完全一致,否则修订记录无法正确关联到实体;
  • 所有操作都基于RavenDB的系统集合@revisions,不需要创建任何自定义的遗留集合或额外元数据字段。

内容的提问来源于stack exchange,提问作者Zote

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 09:05:00