【问题标题】:Cosmos Db Trigger is not being run when inserting new document插入新文档时未运行 Cosmos Db 触发器
【发布时间】:2020-07-13 02:30:09
【问题描述】:

我正在使用 Azure Cosmos DB。我在 Azure 门户中创建了一个简单的触发器,如下所示:

  var context = getContext();
  var request = context.getRequest();

  // item to be created in the current operation
  var itemToCreate = request.getBody();
  itemToCreate["address"] = "test";

  // update the item that will be created
  request.setBody(itemToCreate);

不幸的是,当我插入新文档时,这个触发器没有被触发。我还尝试将“触发类型”设置为“发布”。我错过了什么吗?

【问题讨论】:

    标签: java azure azure-cosmosdb azureportal azure-java-sdk


    【解决方案1】:

    根据@Guarav Mantri 和@Hasan Savaran 的回答,唯一的方法是在通过API 创建项目时指定触发器。我已经设法在 Java Azure SDK 中做到了:

     RequestOptions options = new RequestOptions();
     options.setPreTriggerInclude(Arrays.asList("pre"));
     documentClient.createDocument(
                        collectionLink(),
                        documentToAdd,
                        options,
                        true);
    

    虽然我对这个解决方案不满意,因为例如通过 Portal 创建项目时不会触发触发器。

    【讨论】:

      【解决方案2】:

      好问题!我一直认为触发器会自动运行:)。

      我相信只要插入文档,触发器就不会自动运行。您需要做的是在创建文档时指定要运行的触发器。

      您需要做的是在发送创建文档请求时通过将触发器名称作为请求选项传递来注册触发器。

      例如,请参阅此处的代码:https://docs.microsoft.com/en-us/azure/cosmos-db/how-to-use-stored-procedures-triggers-udfs#pre-triggers(也复制到下面)。注意RequestOptionsPreTriggerInclude的使用:

      dynamic newItem = new
      {
          category = "Personal",
          name = "Groceries",
          description = "Pick up strawberries",
          isComplete = false
      };
      
      Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
      RequestOptions requestOptions = new RequestOptions { PreTriggerInclude = new List<string> { "trgPreValidateToDoItemTimestamp" } };
      await client.CreateDocumentAsync(containerUri, newItem, requestOptions);
      

      【讨论】:

      • 我设法创建了通知 Azure 运行触发器的 Java 代码:RequestOptions options = new RequestOptions(); options.setPreTriggerInclude(Arrays.asList("pre")); .但问题是这个表已经从我无法更改代码的地方更新了,所以如果触发器会自己触发就完美了;-)
      • so it would be perfect if the trigger would trigger himself ...我也是:)。根据 SQL 经验,我的期望是它会自行运行……啊,好吧……你每天都能学到新东西。
      • Guarav 我会接受你的回答,因为它是正确的,但让问题悬而未决,也许其他人会有其他建议:)
      • 绝对!我也热切地等待 Cosmos DB 团队的朋友加入并提供解决方案。
      • 只是大声思考,可能是通过更改 Feed 机制来处理这种情况,在插入文档时触发函数?
      【解决方案3】:

      在关系数据库中自动触发触发器是有意义的,因为 数据库,你有点知道在触发逻辑中要处理什么。 在 NoSQL 数据库中,由于没有模式,您最终可能会得到一个大型脚本来处理各种异常。 触发器中的大型脚本意味着 Cloud 中的费用更高。使触发器自动化可以使许多客户在物联网解决方案中的账单非常高。 您可以在我的帖子中阅读有关 Azure Cosmos DB 前/后触发器的信息。 https://h-savran.blogspot.com/2020/03/create-triggers.html

      【讨论】:

      • 感谢您的回答。你的解释是有道理的,尽管我更愿意自己决定是否要为我的触发器支付更多费用:) 另外,如果我让触发器升高或只做一行更改,以及所有后果,这应该取决于我。但显然这里没有太多选择。
      • 还有直接从门户创建项目怎么样?:)
      猜你喜欢
      • 2023-01-31
      • 2018-07-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-13
      • 1970-01-01
      • 2019-01-23
      • 2018-03-02
      • 2022-06-23
      相关资源
      最近更新 更多