私はこのトリガーを何時間もいじっていますが、今問題を特定したと思います。
ML8 documentationのようにトリガーの例を設定しました。
より現実的なアクションに変更しました。
問題は、lib.xqy に独自の関数を保持するライブラリ モジュールを使用しているようです。Query Console で lib 自体をテストしましたが、すべての機能が正常に動作します。
アラート アクション自体も QC で正常に実行されます。
simpleTrigger は問題なく動作します。
より複雑なものは、自分のライブラリを使用する関数を削除した場合に実行されます。
トリガーがユーザーによって実行されているか、モジュールが見つからない場所 (モジュール db にあります) から実行されているようです。content-db を指すように trigger-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にあります...
私を悩ませているもう1つのことは、MLドキュメントの例が
xdmp:document-insert("/modules/log.xqy",
text{ "
xquery version '1.0-ml';
..."
}, xdmp:permission('app-user', 'execute'))
この場合、パーミッション app-user は何をしますか?
とにかく主な質問: トリガー アクションでカスタム モジュールを使用すると、トリガーが実行されないのはなぜですか?
この質問を見て、関連していると思いますが、そこの答えがわかりません...
EDIT 開始、トリガー作成ステートメントの詳細:
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 から読み込まれます。
完全を期すために、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 ローカル デプロイ コンテンツを使用してロードするため、アクション ドキュメント自体の権限に問題はないようです。理解できないのは、アクションで独自のモジュールを使用しようとすると、モジュールが見つからないか、(コメント David を参照) モジュールに対する適切な権限がないため、トリガー アクションの実行に失敗することです ...モジュールは /src/lib/lib.xqy の下に roxy でロードされます
2回目の編集
以下を app_specific.rb に追加して、すべてのトリガー スタッフを 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 を指す行を追加するとすぐにトリガーが失敗します...