我有一个附加到 4 个森林的数据库,我想在每次文档中的任何值更改时在 MarkLgic 中创建一个更改文档。变更文件应包含变更日期、旧值和新值。
我能够通过使用提交前和提交后触发器来实现这一点。pre-commit 触发器捕获文档的旧版本,post-commit 具有新版本。我比较这两个文档并创建更改文档。这在更新单个文档时效果很好。
但是,我通过使用 MLCP 从分隔文件加载 20000 个文档来测试此解决方案。我更改了所有文档中单个元素的值,然后再次加载数据。我的触发器只能捕获 20000 个更改文档中的 7000 个。其余文档加载失败,我在 MLCP 中收到一条错误消息:
“XDMP-NEWSTAMP 时间戳对于森林来说太新了”
我通过从提交前和提交后触发器中删除我的代码进行了另一项测试,并且让触发器什么也不做。我再次加载了文件。现在 19000/20000 文档已成功更新,我得到相同的 XDMP-NEWSTAMP 错误。
当我完全删除触发器并加载文档时。20000/20000 被加载和更新。
因此,执行大量触发器似乎会在加载文档时产生问题。
这个问题有解决方案吗?我是否走错了路来完成我需要做的事情?
MLCP 命令: mlcp import -host localhost -port 8000 -username uname -password pwd -input_file_path D:....\file.dsv -delimiter '|' -input_file_type delimited_text -database Overtime -output_collections 测试
创建触发器:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
import module namespace trgr="http://marklogic.com/xdmp/triggers" at "/MarkLogic/triggers.xqy";
trgr:create-trigger("PreCommitTrigger", "Trigger that fires when a document is updated",
trgr:trigger-data-event(
trgr:collection-scope("test"),
trgr:document-content("modify"),
trgr:pre-commit()),
trgr:trigger-module(xdmp:database("Overtime"), "/", "preCommit.xqy"),
fn:true(), xdmp:default-permissions()),
trgr:create-trigger("PostCommitTrigger", "Trigger that fires when a document is updated",
trgr:trigger-data-event(
trgr:collection-scope("test"),
trgr:document-content("modify"),
trgr:post-commit()),
trgr:trigger-module(xdmp:database("Overtime"), "/", "postCommit.xqy"),
fn:true(), xdmp:default-permissions())
加载触发器文档:
xquery version "1.0-ml";
declare namespace html = "http://www.w3.org/1999/xhtml";
xdmp:document-insert('/preCommit.xqy',
text{ " '' "}).
xdmp:document-insert('/postCommit.xqy',
text{ " '' "})