如何从 JS 代码或存储过程在 DocumentDB 中执行预触发器

How to execute a pre-trigger in DocumentDB from a JS code or Stored Procedure

本文关键字:DocumentDB 执行 触发器 存储过程 JS 代码      更新时间:2023-09-26

我在Azure DocumentDB中有一个存储过程,可以批量插入文档。如何在 SP 中执行触发器?

存储过程:

function InsertBulk(obj) {
var collection = getContext().getCollection();
var collectionLink = collection.getSelfLink();
var count = 0;
if (!obj) throw new Error("The array is undefined or null.");
var docsLength = obj.docs.length;
if (docsLength == 0) {
    getContext().getResponse().setBody(0);
}
tryCreate(obj.docs[count], callback);
function tryCreate(doc, callback) {
    var isAccepted = collection.createDocument(collectionLink, doc, callback);
    if (!isAccepted) getContext().getResponse().setBody(count);
}
function callback(err, doc, options) {
    if (err) throw err;
    count++;
    if (count >= docsLength) {
        getContext().getResponse().setBody(count);
    } else {
        tryCreate(obj.docs[count], callback);
    }
}}

据我所知,@Dev的回答不正确,说 DocumentDB 中的触发器隐式触发。在每个 SQL 实现中,它们都会这样做,但在 DocumentDB 中却没有。触发器必须在 DocumentDB 中显式指定,但不允许从 sproc 中指定它们。触发器仅在客户端库中受支持,即使这样,您也必须为希望它们触发的每个操作显式指定触发器。

从好的方面来说,您可以将触发器逻辑移动到 sproc 中。

不能

从存储过程调用触发器。

触发器在对表执行任何操作(如插入、更新、删除)时隐式触发。

假设您编写了一个用于更新表记录的过程。当您的过程将执行时,您创建的触发器也将触发,因为它会在表上执行任何操作时自动触发。

祝你好运,希望这有帮助。