Opret udløsere og brugerdefinerede funktioner
Azure Cosmos DB understøtter pretriggers og post-triggers. Pretriggers udføres, før du ændrer et databaseelement, og efterudløsere udføres efter ændring af et databaseelement. Udløsere udføres ikke automatisk. De skal angives for hver databasehandling, hvor de skal udføres. Når du har defineret en udløser, skal du registrere den ved hjælp af Azure Cosmos DB SDK'er.
Du kan få eksempler på, hvordan du registrerer og kalder en udløser, under pretriggers og post-triggers.
Pretriggers
I følgende eksempel kan du se, hvordan en pretrigger bruges til at validere egenskaberne for et Azure Cosmos-element, der oprettes. Den føjer en tidsstempelegenskab til et element, der er tilføjet for nylig, hvis det ikke indeholder en.
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 ikke have nogen inputparametre. Anmodningsobjektet i udløseren bruges til at manipulere den anmodningsmeddelelse, der er knyttet til handlingen. I det forrige eksempel køres pretriggeren, når du opretter et Azure Cosmos-element, og brødteksten i anmodningsmeddelelsen indeholder det element, der skal oprettes i JSON-format.
Når udløsere registreres, kan du angive de handlinger, den kan køre med. Denne udløser skal oprettes med en TriggerOperation værdi på TriggerOperation.Create, og det er ikke tilladt at bruge udløseren i en erstatningshandling.
Du kan finde eksempler på, hvordan du registrerer og kalder en pretrigger, i artiklen pretriggers.
Efterudløsere
I følgende eksempel vises en postudløser. Denne udløser forespørger om metadataelementet og opdaterer det med oplysninger om det nyoprettede element.
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 ting, der er vigtigt at bemærke, er transaktionsudførelsen af udløsere i Azure Cosmos DB. Efterudløseren kører som en del af den samme transaktion for selve det underliggende element. En undtagelse under udførelsen efter udløseren mislykkes hele transaktionen. Alt, der er bekræftet, annulleres, og der returneres en undtagelse.
Brugerdefinerede funktioner
I følgende eksempel oprettes en UDF til beregning af indkomstskat for forskellige indkomstparenteser. Denne brugerdefinerede funktion bruges derefter i en forespørgsel. I dette eksempel antages det, at der er en objektbeholder med navnet "Indkomster" med egenskaber på følgende måde:
{
"name": "User One",
"country": "USA",
"income": 70000
}
Følgende kodeeksempel er en funktionsdefinition til beregning af indkomstskat for forskellige indkomstparenteser:
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;
}