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

时间:2015-09-18 08:55:23

标签: 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);
}

虽然看起来很难触发这个触发器。

令人恼火的是,getContext()调用在脚本资源管理器中标有绿色波浪线。

enter image description here

1 个答案:

答案 0 :(得分:13)

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

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

使用REST API时,您可以在包含x-ms-documentdb-pre-trigger-includex-ms-documentdb-post-trigger-include的标头中指定触发器。在node.js SDK中,您使用RequestOptions preTriggerIncludepreTriggerInclude属性。对于.NET,您可以这样指定:

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

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