CosmosDB 中的触发器未触发?
Trigger in CosmosDB not fired?
我在我的 CosmosDB 集合中创建了一个简单的预触发器。
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 时,您可以在 header 中使用 x-ms-documentdb-pre-trigger-include
或 x-ms-documentdb-post-trigger-include
指定触发器。在 node.js SDK 中,您使用 RequestOptions preTriggerInclude
或 preTriggerInclude
属性。对于 .NET,您可以这样指定它:
Document createdItem = await client.CreateDocumentAsync(collection.SelfLink, new Document { Id = "documentdb" },
new RequestOptions
{
PreTriggerInclude = new List<string> { "CapitalizeName" },
});
查看有关绿色波浪线讨论的评论。
我在我的 CosmosDB 集合中创建了一个简单的预触发器。
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 时,您可以在 header 中使用 x-ms-documentdb-pre-trigger-include
或 x-ms-documentdb-post-trigger-include
指定触发器。在 node.js SDK 中,您使用 RequestOptions preTriggerInclude
或 preTriggerInclude
属性。对于 .NET,您可以这样指定它:
Document createdItem = await client.CreateDocumentAsync(collection.SelfLink, new Document { Id = "documentdb" },
new RequestOptions
{
PreTriggerInclude = new List<string> { "CapitalizeName" },
});
查看有关绿色波浪线讨论的评论。