OrientDB通过触发器自动记录更改日志

OrientDB automatic on-record changelog via trigger

本文关键字:记录 日志 触发器 OrientDB      更新时间:2023-09-26

长期潜伏,但第一个问题。

终于想出了如何通过触发器维护这个问题的更新日志从函数嵌入 OrientDB 中的记录但我也想维护用户更新记录,也许还有其他元数据,例如更新了哪些道具。

我的用例是使用 HTTP 请求和 JSON 命令数组将来自 c# 的批量更新插入传递到一些基类中,如下所示:

ALTER CLASS V SUPERCLASS +OTriggered
CREATE CLASS ChangeHistory ABSTRACT 
CREATE PROPERTY ChangeHistory.user LINK
CREATE PROPERTY ChangeHistory.changetype STRING
CREATE PROPERTY ChangeHistory.timestamp DATETIME
ALTER PROPERTY ChangeHistory.timestamp DEFAULT sysdate()
CREATE PROPERTY V.changelog EMBEDDEDLIST ChangeHistory 
ALTER PROPERTY V.changelog DEFAULT {“changetype”:”initial creation”}
ALTER CLASS V CUSTOM onAfterUpdate=recordUpdated

有没有办法在触发器中访问该数据?并且是否有使用的风险

orient.getGraphNoTx()

提前感谢!

编辑

我想出了如何使用我的答案中的策略来维护一个非常健壮的更新日志,但我仍然不完全清楚我似乎必须使用的 getGraphNoTx() 的含义。动态钩子是否会在包含更新的事务中触发?

好的,

所以我走得更远,并认为我会发布以防其他人想要实现相同的目标。

1) 将更改日志默认为"已创建记录"

这是可能的,我只是缺少您需要 @class 和 @type 来默认,但只有相关字段才能添加。新行:

ALTER PROPERTY E.changelog DEFAULT [{'@type':'d','@class':'ChangeHistory', 'changetype':'initial creation'}];

2) 捕获更新用户和更新字段

也解决了这个问题,通过在更新记录中添加一个无模式的 prop,从 JS 函数对象获取它

doc.field("updater")

并在删除记录级 prop 之前将其传递给更改日志。这也适用于更新的字段,如果您只传入正在更新的字段。完整的函数创建SQL如下(仅限更新程序,未更新字段)

CREATE FUNCTION recordUpdated "
var graph = orient.getGraphNoTx(); 
var updater = graph.command( 'sql', 'SELECT FROM OUser WHERE name = '"' + doc.field('updater') + ''"'); 
graph.command( 'sql', 'UPDATE ' + doc.field('@rid') + ' ADD changelog = [{'"user'":'"' + updater[0].getId() + ''", '"changetype'":'"Update'"}]');
graph.command( 'sql', 'UPDATE ' + doc.field('@class') + ' REMOVE updater WHERE @rid = '"' + doc.field('@rid') + ''"');
" LANGUAGE JAVASCRIPT;

3) getGraphNoTx()

我找不到 getGraphNoTx() 安全的证据,但我的理解是它只是阻止函数本身作为事务运行。 最坏的情况似乎是更改日志条目收到错误的更新程序?