Skapa lagrade procedurer

Slutförd

Azure Cosmos DB tillhandahåller språkintegrerad, transaktionell körning av JavaScript som gör att du kan skriva lagrade procedurer, utlösare och användardefinierade funktioner. Om du vill anropa en lagrad procedur, utlösare eller användardefinierad funktion måste du registrera den. Mer information finns i How to work with stored procedures, triggers, user-defined functions in Azure Cosmos DB (Arbeta med lagrade procedurer, utlösare och användardefinierade funktioner i Azure Cosmos DB).

Kommentar

Den här lektionen fokuserar på lagrade procedurer, följande enhet omfattar utlösare och användardefinierade funktioner.

Skriva lagrade procedurer

Lagrade procedurer kan skapa, uppdatera, läsa, fråga och ta bort objekt i en Azure Cosmos-container. Lagrade procedurer registreras per samling och kan användas med alla dokument eller bifogade filer i den samlingen.

Här är en enkel lagrad procedur som returnerar ett "Hello World"-svar.

var helloWorldStoredProc = {
    id: "helloWorld",
    serverScript: function () {
        var context = getContext();
        var response = context.getResponse();

        response.setBody("Hello, World");
    }
}

Kontextobjektet ger åtkomst till alla åtgärder som kan utföras i Azure Cosmos DB och åtkomst till begärande- och svarsobjekten. I det här fallet kan du använda svarsobjekt för att ange svarsinnehållet som ska skickas tillbaka till klienten.

Skapa ett objekt med hjälp av en lagrad procedur

När du skapar ett objekt med hjälp av en lagrad procedur infogas objektet i Azure Cosmos DB-containern och ett ID för det nyligen skapade objektet returneras. Genereringen av ett objekt är en asynkron åtgärd och är beroende av JavaScript-motringningsfunktionerna. Återanropsfunktionen har två parametrar: en för felobjektet om åtgärden misslyckas och en annan för ett returvärde, i det här fallet det skapade objektet. I motringningen kan du antingen hantera undantaget eller utlösa ett fel. Om ett återanrop inte har angetts och det finns ett fel genererar Azure Cosmos DB-körningen ett fel.

Den lagrade proceduren innehåller också en parameter för att ange beskrivningen som ett booleskt värde. När parametern är inställd på true och beskrivningen saknas utlöser den lagrade proceduren ett undantag. I annat fall fortsätter resten av den lagrade proceduren att köras.

Den här lagrade proceduren tar som indata documentToCreate, brödtexten i ett dokument som ska skapas i den aktuella samlingen. Alla sådana åtgärder är asynkrona och är beroende av återanrop till JavaScript-funktioner.

var createDocumentStoredProc = {
    id: "createMyDocument",
    body: function createMyDocument(documentToCreate) {
        var context = getContext();
        var collection = context.getCollection();
        var accepted = collection.createDocument(collection.getSelfLink(),
              documentToCreate,
              function (err, documentCreated) {
                  if (err) throw new Error('Error' + err.message);
                  context.getResponse().setBody(documentCreated.id)
              });
        if (!accepted) return;
    }
}

Matriser som indataparametrar för lagrade procedurer

När du definierar en lagrad procedur i Azure-portalen skickas alltid indataparametrar som en sträng till den lagrade proceduren. Även om du skickar en matris med strängar som indata, konverteras matrisen till en sträng och skickas till den lagrade proceduren. Du kan undvika detta genom att definiera en funktion i den lagrade proceduren som parsar strängen som en matris. Följande kod visar hur du parsar en strängindataparameter som en matris:

function sample(arr) {
    if (typeof arr === "string") arr = JSON.parse(arr);

    arr.forEach(function(a) {
        // do something here
        console.log(a);
    });
}

Begränsad körning

Alla Azure Cosmos DB-åtgärder måste slutföras inom en begränsad tid. Lagrade procedurer har en begränsad tid att köra på servern. Alla samlingsfunktioner returnerar ett booleskt värde som representerar om åtgärden slutförs eller inte

Transaktioner i lagrade procedurer

Du kan implementera transaktioner för objekt i en container med hjälp av en lagrad procedur. JavaScript-funktioner kan implementera en fortsättningsbaserad modell för att batch- eller återuppta körningen. Fortsättningsvärdet kan vara valfritt värde och dina program kan sedan använda det här värdet för att återuppta en transaktion från en ny startpunkt. Följande diagram visar hur transaktionsfortsättningsmodellen kan användas för att upprepa en funktion på serversidan tills funktionen har slutfört hela bearbetningsarbetsbelastningen.

This diagram depicts how the transaction continuation model can be used to repeat a server-side function until the function finishes its entire processing workload.