Triggers en door de gebruiker gedefinieerde functies maken
Azure Cosmos DB biedt ondersteuning voor pretriggers en post-triggers. Pretriggers worden uitgevoerd voordat u een database-item wijzigt en post-triggers worden uitgevoerd nadat u een database-item hebt gewijzigd. Triggers worden niet automatisch uitgevoerd. Ze moeten worden opgegeven voor elke databasebewerking waar u ze wilt uitvoeren. Nadat u een trigger hebt gedefinieerd, moet u deze registreren met behulp van de Azure Cosmos DB SDK's.
Zie pretriggers en post-triggers voor voorbeelden van het registreren en aanroepen van een trigger.
Pretriggers
In het volgende voorbeeld ziet u hoe een pretrigger wordt gebruikt om de eigenschappen te valideren van een Azure Cosmos-item dat wordt gemaakt. Er wordt een tijdstempeleigenschap toegevoegd aan een nieuw toegevoegd item als dit geen item bevat.
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 kunnen geen invoerparameters hebben. Het aanvraagobject in de trigger wordt gebruikt voor het bewerken van het aanvraagbericht dat is gekoppeld aan de bewerking. In het vorige voorbeeld wordt de pretrigger uitgevoerd bij het maken van een Azure Cosmos-item en bevat de hoofdtekst van het aanvraagbericht het item dat moet worden gemaakt in JSON-indeling.
Wanneer triggers zijn geregistreerd, kunt u de bewerkingen opgeven waarmee deze kan worden uitgevoerd. Deze trigger moet worden gemaakt met een TriggerOperation
waarde van TriggerOperation.Create
, waarbij de trigger in een vervangingsbewerking wordt gebruikt, is niet toegestaan.
Ga naar het artikel pretriggers voor voorbeelden van het registreren en aanroepen van een pretrigger.
Post-triggers
Hieronder ziet u een voorbeeld van een post-trigger. Deze trigger zoekt naar het metagegevensitem en werkt dit bij met informatie over het nieuwe item.
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;
}
}
Eén ding dat belangrijk is om te weten is de transactionele uitvoering van triggers in Azure Cosmos DB. De post-trigger wordt uitgevoerd als onderdeel van dezelfde transactie voor het onderliggende item zelf. Een uitzondering tijdens de uitvoering na de trigger mislukt de hele transactie. Alles wat is doorgevoerd, wordt teruggedraaid en er wordt een uitzondering geretourneerd.
Door de gebruiker gedefinieerde functies
In het volgende voorbeeld wordt een UDF gemaakt voor het berekenen van de inkomstenbelasting voor verschillende inkomensschijven. Deze door de gebruiker gedefinieerde functie kan vervolgens worden gebruikt in een query. In dit voorbeeld wordt ervan uitgegaan dat er een container met de naam 'Inkomsten' met eigenschappen als volgt is:
{
"name": "User One",
"country": "USA",
"income": 70000
}
Het volgende codevoorbeeld is een functiedefinitie voor het berekenen van de inkomstenbelasting voor verschillende inkomenshaken:
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;
}