Erstellen von Triggern und benutzerdefinierten Funktionen

Abgeschlossen

Azure Cosmos DB unterstützt vorangestellte und nachgestellte Trigger. Vorangestellte Trigger werden vor dem Ändern eines Datenbankelements ausgeführt, nachgestellte Trigger danach. Trigger werden nicht automatisch ausgeführt. Sie müssen für jeden Datenbankvorgang angegeben werden, in dem sie ausgeführt werden sollen. Nachdem Sie einen Trigger definiert haben, sollten Sie ihn mithilfe der Azure Cosmos DB-SDKs registrieren.

Beispiele zum Registrieren und Aufrufen eines Triggers finden Sie unter Vorangestellte Trigger und Nachgestellte Trigger.

Vorangestellte Trigger

Das folgende Beispiel zeigt, wie ein die Eigenschaften eines Azure Cosmos-Elements, das erstellt wird, mithilfe eines vorangestellten Triggers überprüft werden können. Wenn neu hinzugefügte Elemente keine „timestamp“-Eigenschaft enthalten, fügt er eine hinzu.

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);
}

Vorangestellte Trigger können keine Eingabeparameter übernehmen. Das Anforderungsobjekt im Trigger kann verwendet werden, um die Anforderungsnachricht zu verändern, die dem Vorgang zugeordnet ist. Im vorherigen Beispiel wird der vorangestellte Trigger ausgeführt, wenn ein Azure Cosmos-Element erstellt wird und der Text der Anforderungsnachricht das zu erstellende Element im JSON-Format enthält.

Wenn Trigger registriert werden, können Sie die Vorgänge angeben, mit denen sie ausgeführt werden können. Dieser Trigger sollte mit dem TriggerOperation-Wert TriggerOperation.Create erstellt werden. Die Verwendung des Triggers in einem Ersetzungsvorgang ist nicht zulässig.

Beispiele für das Registrieren und Aufrufen eines vorangestellten Triggers finden Sie im Artikel Vorangestellte Trigger.

Nachgestellte Trigger

Das folgende Beispiel zeigt einen nachgestellten Trigger. Dieser Trigger fragt das Metadatenelement ab und aktualisiert es mit den Details zum neu erstellten 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;
    }
}

Ein wichtiger Aspekt, den es zu beachten gilt, ist die transaktionale Ausführung von Triggern in Azure Cosmos DB. Der nachgestellte Trigger wird im Rahmen der gleichen Transaktion für das zugrunde liegende Element ausgeführt. Tritt während der Ausführung des nachgestellten Triggers eine Ausnahme auf, ist die gesamte Transaktion nicht erfolgreich. Sämtliche Commits werden zurückgesetzt, und es wird eine Ausnahme zurückgegeben.

Benutzerdefinierte Funktionen

Das folgende Beispiel erstellt eine benutzerdefinierte Funktion, um die Einkommenssteuer für verschiedene Einkommensgruppen zu berechnen. Diese benutzerdefinierte Funktion wird dann innerhalb einer Abfrage verwendet. Nehmen wir bei diesem Beispiel an, dass es einen Container namens „Incomes“ mit folgenden Eigenschaften gibt:

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

Das folgende Codebeispiel ist eine Funktionsdefinition, um die Einkommenssteuer für verschiedene Einkommensgruppen zu berechnen:

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;
    }