1

私はこのトリガーを何時間もいじっていますが、今問題を特定したと思います。

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 を指す行を追加するとすぐにトリガーが失敗します...

4

2 に答える 2

0

トリガーが適切に機能するためには、満たす必要がある基準がいくつかあります。デビッドはすでにそれらの一部について言及しました。リストを完成させてみましょう:

  • トリガー定義を含むデータベースが必要です。これは、trgr:create-triggerが実行されたデータベースです。通常Triggersまたは一部app-triggers
  • このトリガー データベースは、トリガー データベースとしてコンテンツ データベースに割り当てる必要があります (その逆ではありません)。
  • トリガー イベントが発生するとすぐに実行されるコードを含むトリガー モジュールを指定します。はtrgr:trigger-module、モジュールの uri と、それが含まれるデータベースを明示的に指します。
  • そのトリガー モジュールで使用されるすべてのライブラリは、トリガー モジュールと同じデータベースにある必要があります。通常、トリガー モジュールと関連するライブラリの両方が、Modulesまたは一部のに格納されますapp-modules

パーミッションに関しては、以下が適用されます。

  • まず、ドキュメント (uri とコレクション) を挿入する権限が必要です。
  • 次に、トリガーを実行できるようにするには、挿入を行うユーザーは、トリガー モジュールとすべての関連ライブラリに対する読み取りおよび実行権限を持つ役割 (直接、継承、または amps 経由) を持っている必要があります。
  • 次に、その同じユーザーが、トリガー モジュールが実行する必要があることを実行する権限を持っている必要があります。

create-triggers ステートメントを見ると、トリガー モジュールが app-content データベースを指していることに気付きました。これは、app-content データベース内のライブラリも検索することを意味します。トリガー モジュールとライブラリを app-modules データベースに配置することをお勧めします。

また、app-user実行許可に関しては、これは単なる慣習です。nobodyユーザーにはapp-user役割があります。これは通常、nobodyユーザーがリライター コードを実行できるようにするために使用されます。

チッ!

于 2015-09-14T07:13:46.820 に答える
0

おそらくトリガー作成ステートメント全体など、もう少し情報を提供していただけますか?

トリガーを作成する際は、次のことに注意してください。

  1. トリガーを挿入するトリガー データベースは、トリガーで参照するコンテンツ データベースで定義されたものである必要があります。
  2. trgr:trigger-moduleモジュールデータベースと実行するモジュールを定義できます。これが適切に定義されていると、どのよう/lib/sccss-lib.xqyに見つからないかわかりません-それが権限項目でない限り...

次に、質問の他の項目に進みます。クエリコンソールでテストします。それにはそのユーザーの役割があります-多くの場合、管理者として実行されます...ドキュメントが存在する場合でも、MarkLogicは「見つかりません」というメッセージを表示します-そして、あなたは単にそれにアクセスできません。そのため、モジュール データベース内のドキュメントのアクセス許可に問題がある可能性があります。

于 2015-09-12T00:29:56.820 に答える