建立觸發程序和使用者定義的函數
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.Create
的 TriggerOperation
值來建立,不允許在取代作業中使用觸發程序。
如需如何註冊和呼叫預先觸發程序的範例,請造訪預先觸發程序一文。
後續觸發程序
下列範例顯示後續觸發程序。 此觸發程序可查詢中繼資料項目,並為其提供新建立項目的詳細資料更新。
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;
}