我已经修补这个触发器几个小时了,我想我现在已经查明了这个问题。
我在ML8 文档中设置了一个示例触发器。
现在我已将其修改为更真实的动作。
问题似乎是我使用了一个库模块,它在 lib.xqy 中保存了我自己的函数。我已经在查询控制台中测试了库本身,所有功能都运行良好。
警报操作本身在 QC 中也运行良好。
simpleTrigger 工作正常。
如果我删除使用我自己的库的函数,则运行更复杂的。
似乎触发器是由用户运行或从找不到我的模块的地方(在模块数据库中)运行的。我已将 trigger-db 设置为指向 content-db。
触发器查看新文档的目录(文档创建)。
如果我想使用我自己的 lib 函数,抛出的错误是:
[1.0-ml] XDMP-MODNOTFOUND: (err:XQST0059) xdmp:eval("xquery version
"1.0-ml"; let $uri := '/marklo...", (),
<options xmlns="xdmp:eval"><database>12436607035003930594</database>
<modules>32519102440328...</options>)
-- Module /lib/sccss-lib.xqy not found
该模块位于 modules-db...
困扰我的另一件事是 ML doc 中的示例
xdmp:document-insert("/modules/log.xqy",
text{ "
xquery version '1.0-ml';
..."
}, xdmp:permission('app-user', 'execute'))
在这种情况下,权限应用程序用户会做什么?
无论如何,主要问题:如果我在触发器操作中使用自定义模块,为什么触发器不会运行?
我看过这个问题并认为它是相关的,但我不明白那里的答案......
编辑开始,有关触发器创建语句的更多信息:
xquery version "1.0-ml";
import module namespace trgr="http://marklogic.com/xdmp/triggers"
at "/MarkLogic/triggers.xqy";
trgr:create-trigger("sensorTrigger", "Simple trigger for connection systems sensor, the action checks how long this device is around the sensor",
trgr:trigger-data-event(
trgr:directory-scope("/marklogic.solutions.obi/source/", "1"),
trgr:document-content("create"),
trgr:post-commit()),
trgr:trigger-module(xdmp:database("cluey-app-content"), "/triggers/", "check-time-at-sensor.xqy"),
fn:true(), xdmp:default-permissions() )
确实,触发器是从 QC 创建的,因此确实是管理员(我还必须弄清楚如何将代码添加到 app-specific.rb)。并且触发器操作也是从 QC 加载的,其中包含与文档中的触发器示例等效的 doc insert 语句。
为了完整起见,我根据 Geert 的建议将此添加到 app-specific.rb
alias_method :original_deploy_modules, :deploy_modules
def deploy_modules()
original_deploy_modules
# and apply correct permissions
r = execute_query %Q{
xquery version "1.0-ml";
for $uri in cts:uris()
return (
$uri,
xdmp:document-set-permissions($uri, (
xdmp:permission("#{@properties["ml.app-name"]}-role", "read"),
xdmp:permission("#{@properties["ml.app-name"]}-role", "execute")
))
)
},
{ :db_name => @properties["ml.modules-db"] }
end
为了进行测试,我还将它作为内容的一部分加载(使用 ./ml 本地部署内容来加载它,正如在操作之前所说的那样,它将运行,因此操作文档本身的权限似乎没有问题。我做什么不明白的是,一旦我尝试在操作中使用我自己的模块,它就找不到模块,或者(见评论大卫)对模块没有正确的权限。所以触发操作将无法运行......该模块在 /src/lib/lib.xqy 下加载了 roxy
第二次编辑
通过将以下内容添加到 app_specific.rb,我添加了所有触发 stuf 以包含在 roxy 中:
# HK voor gebruik modules die geen REST permissies hebben in een rest extension
alias_method :original_deploy_modules, :deploy_modules
def deploy_modules()
original_deploy_modules
# Create triggers
r = execute_query(%Q{
xquery version "1.0-ml";
import module namespace trgr="http://marklogic.com/xdmp/triggers"
at "/MarkLogic/triggers.xqy";
xdmp:log("Installing triggers.."),
try {
trgr:remove-trigger("sensorTrigger")
} catch ($ignore) {
};
xquery version "1.0-ml";
import module namespace trgr="http://marklogic.com/xdmp/triggers"
at "/MarkLogic/triggers.xqy";
trgr:create-trigger("sensorTrigger", "Trigger to check duration at sensor",
trgr:trigger-data-event(
trgr:directory-scope("/marklogic.solutions.obi/source/", "1"),
trgr:document-content("create"),
trgr:post-commit()
),
trgr:trigger-module(xdmp:modules-database(), "/", "/triggers/check-time-at-sensor.xqy"),
fn:true(),
xdmp:default-permissions(),
fn:false()
)
},
######## THIRD EDIT ###############
#{ :app_name => @properties["ml.app-name"] }
{ :db_name => @properties["ml.modules-db"] }
)
# and apply correct permissions
r = execute_query %Q{
xquery version "1.0-ml";
for $uri in cts:uris()
return (
$uri,
xdmp:document-set-permissions($uri, (
xdmp:permission("#{@properties["ml.app-name"]}-role", "read"),
xdmp:permission("#{@properties["ml.app-name"]}-role", "execute")
))
)
},
{ :db_name => @properties["ml.modules-db"] }
end
如您所见,根路径现在是“/”行
trgr:trigger-module(xdmp:modules-database(), "/", "/triggers/check-time-at-sensor.xqy")
我还手动添加了权限,但是只要添加指向 sccs-lib.xqy 的行,我的触发器就会失败......