DocumentDb中的触发器没有被触发?

Tho*_*tzl 4 azure-cosmosdb

我在DocumentDB集合中创建了一个简单的Pre Trigger.

function testTrigger() {
    var context = getContext();
    var request = context.getRequest();
    var documentToCreate = request.getBody();
    documentToCreate["test"] = "Added by trigger";
    request.setBody(documentToCreate);
}
Run Code Online (Sandbox Code Playgroud)

虽然看起来,但这个触发器根本没有被触发.

什么也令人恼火,getContext()调用在脚本资源管理器中标有绿色波浪线.

在此输入图像描述

Lar*_*one 13

触发器似乎没有......好......触发的问题是你没有在触发操作中指定它.触发器不是自动的.必须为要执行它们的每个数据库操作指定它们.

就个人而言,我认为这是一个不幸的设计选择,我决定不在我自己的代码中使用触发器.相反,我在存储过程中嵌入了所有业务规则约束.我发现这有点干净,并且不用担心我会忘记指定一个触发器,或者(更有可能)别人向数据库编写代码甚至不知道他们应该这样做.我意识到有人可以通过直接访问文档来绕过我的存储过程并违反业务规则,但我不知道在DocumentDB中有什么方法可以防止这种情况发生.如果有一种方法可以使触发器自动生成,那就可以防止这种情况发生.

使用REST API时,您可以使用x-ms-documentdb-pre-trigger-include或指定标头中的触发器x-ms-documentdb-post-trigger-include.在node.js SDK中,您使用RequestOptions preTriggerIncludepreTriggerIncludeproperty.对于.NET,您可以像这样指定它:

Document createdItem = await client.CreateDocumentAsync(collection.SelfLink, new Document { Id = "documentdb" },
new RequestOptions
{
    PreTriggerInclude = new List<string> { "CapitalizeName" },
});
Run Code Online (Sandbox Code Playgroud)

有关绿色波浪形的讨论,请参阅评论.

  • 哇!这不直观。我不希望我必须明确指定要在操作上执行的触发器。这个答案的坦克! (3认同)
  • 是的,正如我所说,不是自动制作触发器是一个不幸的设计决定,恕我直言. (2认同)