Skapa utlösare och användardefinierade funktioner
Azure Cosmos DB stöder pretriggers och post-triggers. Pretriggers körs innan du ändrar ett databasobjekt och efterutlösare körs efter att ett databasobjekt har modifierats. Utlösare körs inte automatiskt. De måste anges för varje databasåtgärd där du vill att de ska köras. När du har definierat en utlösare bör du registrera den med hjälp av Azure Cosmos DB SDK:er.
Exempel på hur du registrerar och anropar en utlösare finns i pretriggers och post-triggers.
Pretriggers
I följande exempel visas hur en pretrigger används för att verifiera egenskaperna för ett Azure Cosmos-objekt som skapas. Den lägger till en tidsstämpelegenskap till ett nyligen lagt objekt om det inte innehåller något.
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);
}
Pretriggers kan inte ha några indataparametrar. Begärandeobjektet i utlösaren används för att manipulera begärandemeddelandet som är associerat med åtgärden. I föregående exempel körs pretriggern när du skapar ett Azure Cosmos-objekt och meddelandetexten för begäran innehåller det objekt som ska skapas i JSON-format.
När utlösare har registrerats kan du ange vilka åtgärder som de kan köras med. Den här utlösaren ska skapas med värdet TriggerOperation
TriggerOperation.Create
, med utlösaren i en ersättningsåtgärd tillåts inte.
Exempel på hur du registrerar och anropar en pretrigger finns i artikeln pretriggers .
Efterutlösare
Följande exempel visar en efterutlösare. Den här utlösaren frågar efter metadataobjektet och uppdaterar det med information om det nyligen skapade objektet.
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;
}
}
En viktig sak att notera är den transaktionella körningen av utlösare i Azure Cosmos DB. Efterutlösaren körs som en del av samma transaktion för själva det underliggande objektet. Ett undantag under körningen efter utlösaren misslyckas med hela transaktionen. Allt som har checkats in återställs och ett undantag returneras.
Användardefinierade funktioner
Följande exempel skapar en användardefinierad funktion som beräknar inkomstskatten för olika inkomstintervall. Den här användardefinierade funktionen används sedan i en fråga. I det här exemplet förutsätter vi att det finns en container med namnet "Inkomster" med följande egenskaper:
{
"name": "User One",
"country": "USA",
"income": 70000
}
Följande kodexempel är en funktionsdefinition för att beräkna inkomstskatt för olika inkomstparenteser:
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;
}