建立觸發程序和使用者定義的函數

已完成

Azure Cosmos DB 支援預先觸發程序和後續觸發程序。 預先觸發程序會在修改資料庫項目之前執行,而後續觸發程序則在修改資料庫項目執行之後執行。 不會自動執行觸發程序。 必須針對您想要執行觸發程序的每個資料庫作業指定觸發程序。 定義觸發程序之後,您應該使用 Azure Cosmos DB SDK 進行註冊該觸發程序。

如需如何註冊和呼叫觸發程序的範例,請參閱預先觸發程序後續觸發程序

預先觸發程序

下列範例示範如何使用預先觸發程序驗證即將建立的 Azure Cosmos 項目屬性。 如果新增的項目未包含時間戳記屬性,則會為其新增一個。

function validateToDoItemTimestamp() {
    var context = getContext();
    var request = context.getRequest();

    // item to be created in the current operation
    var itemToCreate = request.getBody();

    // validate properties
    if (!("timestamp" in itemToCreate)) {
        var ts = new Date();
        itemToCreate["timestamp"] = ts.getTime();
    }

    // update the item that will be created
    request.setBody(itemToCreate);
}

預先觸發程序不能有任何輸入參數。 觸發程序中的要求物件可供操作與作業相關聯的要求訊息。 在前述範例中,預先觸發程序會在建立 Azure Cosmos 項目時執行,而且要求訊息本文會包含要以 JSON 格式建立的項目。

註冊觸發程式時,您可以指定可執行檔作業。 此觸發程序應該使用 TriggerOperation.CreateTriggerOperation 值來建立,不允許在取代作業中使用觸發程序。

如需如何註冊和呼叫預先觸發程序的範例,請造訪預先觸發程序一文。

後續觸發程序

下列範例顯示後續觸發程序。 此觸發程序可查詢中繼資料項目,並為其提供新建立項目的詳細資料更新。

function updateMetadata() {
var context = getContext();
var container = context.getCollection();
var response = context.getResponse();

// item that was created
var createdItem = response.getBody();

// query for metadata document
var filterQuery = 'SELECT * FROM root r WHERE r.id = "_metadata"';
var accept = container.queryDocuments(container.getSelfLink(), filterQuery,
    updateMetadataCallback);
if(!accept) throw "Unable to update metadata, abort";

function updateMetadataCallback(err, items, responseOptions) {
    if(err) throw new Error("Error" + err.message);
        if(items.length != 1) throw 'Unable to find metadata document';

        var metadataItem = items[0];

        // update metadata
        metadataItem.createdItems += 1;
        metadataItem.createdNames += " " + createdItem.id;
        var accept = container.replaceDocument(metadataItem._self,
            metadataItem, function(err, itemReplaced) {
                    if(err) throw "Unable to update metadata, abort";
            });
        if(!accept) throw "Unable to update metadata, abort";
        return;
    }
}

請務必注意的是 Azure Cosmos DB 中的觸發程序交易式執行。 後續觸發程序會在基礎項目本身的相同交易中執行。 後續觸發程序執行期間發生的例外狀況,會導致整個交易失敗。 系統會復原已認可的所有項目,並傳回例外狀況。

使用者自訂函數

下列範例會建立 UDF 來計算各種收入等級的所得稅。 接下來,此使用者定義函式會在查詢內使用。 為了方便此範例的說明,我們假設有名為「收入」的容器,且其屬性顯示如下:

{
   "name": "User One",
   "country": "USA",
   "income": 70000
}

下列範例程式碼為計算各種收入等級之所得稅的函式定義:

function tax(income) {

        if(income == undefined)
            throw 'no input';

        if (income < 1000)
            return income * 0.1;
        else if (income < 10000)
            return income * 0.2;
        else
            return income * 0.4;
    }