我在CosmosDB集合中创建了一个简单的Pre Trigger。
function testTrigger() {
var context = getContext();
var request = context.getRequest();
var documentToCreate = request.getBody();
documentToCreate["test"] = "Added by trigger";
request.setBody(documentToCreate);
}
尽管看起来似乎完全没有触发该触发器。
同样令人烦恼的是,脚本浏览器中的getContext()调用标有绿色的波浪线。
触发器似乎没有...好...被触发的问题是,您没有在触发操作上指定它。触发器不是自动的。必须为每个要执行它们的数据库操作指定它们。
就个人而言,我认为这是一个不幸的设计选择,我决定完全不在我自己的代码中使用触发器。相反,我将所有业务规则约束都嵌入了存储过程中。我发现这样做会更清洁一些,并且消除了我忘记指定触发器或(更有可能)其他人向数据库编写代码的人甚至都不知道应该这样做的担心。我意识到有人可以通过直接进入文档来绕过我的存储过程并违反业务规则,但是我不知道DocumentDB中有什么方法可以防止这种情况发生。如果有一种使触发器自动的方法,那将可以防止这种情况的发生。
使用REST API时,您可以使用x-ms-documentdb-pre-trigger-include
或在标头中指定触发器x-ms-documentdb-post-trigger-include
。在node.js SDK中,您可以使用RequestOptionspreTriggerInclude
或preTriggerInclude
属性。对于.NET,您可以这样指定:
Document createdItem = await client.CreateDocumentAsync(collection.SelfLink, new Document { Id = "documentdb" },
new RequestOptions
{
PreTriggerInclude = new List<string> { "CapitalizeName" },
});
看到评论中关于绿色的讨论。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句