OrientDB通过触发器自动记录更改日志
OrientDB automatic on-record changelog via trigger
长期潜伏,但第一个问题。
终于想出了如何通过触发器维护这个问题的更新日志从函数嵌入 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() 安全的证据,但我的理解是它只是阻止函数本身作为事务运行。 最坏的情况似乎是更改日志条目收到错误的更新程序?
相关文章:
- UI的日志记录框架
- 将Function-Nothing日志记录返回到控制台
- Ember.js——如何对模型进行控制台日志记录
- 日志记录功能/对象名称's在函数堆栈内的javascript中
- 扩展 console.log() 的 javascript Web 应用程序的客户端日志记录
- 日志记录时避免 Promise 构造函数反模式
- 在使用 Html/WinJS 开发的 Metro 应用程序中实现日志记录
- 客户端日志记录
- OrientDB通过触发器自动记录更改日志
- 如何在 mvc3 Web 应用程序的生产版本中删除 JS 日志记录调用
- 在 $.ajaxSetup 转换器中获取 ajax 请求 URL,以便进行日志记录
- Web 服务的快速顺序日志记录
- AngularJS:客户端错误的服务器端日志记录
- 如果用户未登录,如何使用 Jquery AJAX 加载内部日志记录页
- 自动日志记录 JavaScript
- 是否有JavaScript API可以将日志发送到云日志记录服务(如papertrail)
- 如何使用快乐的js进行每个用户群的日志记录
- 如果用户禁用了JS, Apache可以记录日志吗?
- 修改对象的原型,以便在每次请求变量时向控制台记录日志
- 为什么我的测试失败,并且lodash方法中的console.log()语句没有记录日志