Tworzenie wyzwalaczy i funkcji zdefiniowanych przez użytkownika

Ukończone

Usługa Azure Cosmos DB obsługuje wyzwalacze wstępne i wyzwalacze po operacji. Wyzwalacze wstępne są wykonywane przed zmodyfikowaniem elementu bazy danych i wyzwalaczami po zmodyfikowaniu elementu bazy danych. Wyzwalacze nie są wykonywane automatycznie. Należy je określić dla każdej operacji bazy danych, w której mają być wykonywane. Po zdefiniowaniu wyzwalacza należy zarejestrować go przy użyciu zestawów SDK usługi Azure Cosmos DB.

Przykłady rejestrowania i wywoływania wyzwalacza można znaleźć w temacie Pretriggers and post-triggers (Wyzwalacze wstępne i wyzwalacze po wywołaniu).

Pretriggers

W poniższym przykładzie pokazano, jak jest używany pretrigger do weryfikowania właściwości tworzonego elementu usługi Azure Cosmos. Dodaje właściwość znacznika czasu do nowo dodanego elementu, jeśli nie zawiera tej właściwości.

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 nie może mieć żadnych parametrów wejściowych. Obiekt żądania w wyzwalaczu służy do manipulowania komunikatem żądania skojarzonym z tą operacją. W poprzednim przykładzie podczas tworzenia elementu usługi Azure Cosmos jest uruchamiany moduł wstępny, a treść komunikatu żądania zawiera element, który ma zostać utworzony w formacie JSON.

Podczas rejestrowania wyzwalaczy można określić operacje, z którymi można je uruchamiać. Ten wyzwalacz należy utworzyć z wartością TriggerOperation TriggerOperation.Create, używając wyzwalacza w operacji zastępowania, nie jest dozwolony.

Przykłady rejestrowania i wywoływania pretrigger można znaleźć w artykule pretriggers ( Pretriggers ).

Wyzwalacze wykonywane po operacji

W poniższym przykładzie pokazano wyzwalacz wykonywany po operacji. Ten wyzwalacz wysyła zapytanie o element metadanych i aktualizuje go za pomocą informacji o nowo utworzonym elemencie.

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

Jedną rzeczą, o której należy pamiętać, jest transakcyjne wykonywanie wyzwalaczy w usłudze Azure Cosmos DB. Wyzwalacz wykonywany po operacji w ramach tej samej transakcji dla samego elementu bazowego. Wyjątek podczas wykonywania po wyzwoleniu kończy się niepowodzeniem całej transakcji. Wszystkie zatwierdzone elementy są cofane i zwracany jest wyjątek.

Funkcje zdefiniowane przez użytkownika

Poniższy przykład pokazuje tworzenie funkcji zdefiniowanej przez użytkownika w celu obliczenia podatku dochodowego dla różnych przedziałów dochodu. Ta funkcja zdefiniowana przez użytkownika zostanie następnie użyta w zapytaniu. Na potrzeby tego przykładu założono, że istnieje kontener o nazwie "Dochody" z właściwościami w następujący sposób:

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

Poniższy przykład kodu to definicja funkcji do obliczenia podatku dochodowego dla różnych przedziałów dochodów:

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