长期潜伏但第一个问题。
最后想出了如何通过触发此问题来维护更改日志 Embedding record from function in OrientDB 但我也想维护用户更新记录,也许还有更新道具的其他元数据。
我的用例是使用带有JSON命令数组的HTTP请求将批量的upserts从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()的含义,我似乎必须使用它。动态挂钩是否在包含更新的事务中触发?
答案 0 :(得分:1)
好的,所以我已经进一步了解并且认为我会发布以防其他人想要实现相同的目标。
1)将更改日志默认为“已创建记录”
这是可能的,我只是错过了你需要@class和@type到DEFAULT,但只有ADD的相关字段。 新行:
ALTER PROPERTY E.changelog DEFAULT [{'@type':'d','@class':'ChangeHistory', 'changetype':'initial creation'}];
2)诱捕更新用户和更新字段
通过向更新记录添加无模式prop,从JS函数对象中获取它,解决了这个问题
doc.field("updater")
并在删除记录级prop之前将其传递给changelog。如果仅传入正在更新的字段,这也适用于更新的字段。完整的函数创建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()的证据是安全的,但我的理解是它只是阻止函数本身作为事务运行。最坏的情况似乎是更改日志条目收到错误的更新程序?