Share via


Opgeslagen procedures

Azure Cosmos DB is een wereldwijd gedistribueerde database met meerdere modellen die ondersteuning biedt voor de document-, grafiek- en sleutelwaardegegevensmodellen. De inhoud in deze sectie is bedoeld voor het maken, opvragen en beheren van documentresources met behulp van de SQL API via REST.

Een opgeslagen procedure is een stuk toepassingslogica dat is geschreven in JavaScript en dat als één transactie wordt geregistreerd en uitgevoerd op een verzameling. In Azure Cosmos DB wordt JavaScript gehost in dezelfde geheugenruimte als de database. Aanvragen binnen opgeslagen procedures worden daarom uitgevoerd in hetzelfde bereik van een databasesessie. Met dit proces kan Azure Cosmos DB ACID garanderen voor alle bewerkingen die deel uitmaken van één opgeslagen procedure.

De opgeslagen procedureresource wordt vertegenwoordigd door sprocs in het Azure Cosmos DB-resourcemodel.

De opgeslagen procedureresource heeft een vast schema. De hoofdteksteigenschap bevat de toepassingslogica. In het volgende voorbeeld ziet u de JSON-constructie van een opgeslagen procedure.

{    
   "id":"SimpleStoredProc",  
   "body":"function (docToCreate, addedPropertyName, addedPropertyValue {getContext().getResponse().setBody('Hello World');}",  
   "_rid":"hLEEAI1YjgcBAAAAAAAAgA==",  
   "_ts":1408058682,  
   "_self":"dbs\/hLEEAA==\/colls\/hLEEAI1Yjgc=\/sprocs\/hLEEAI1YjgcBAAAAAAAAgA==\/",  
   "_etag":"00004100-0000-0000-0000-53ed453a0000"  
}  
  

Als u alleen de modus Alle-toegang hebt voor een bepaalde opgeslagen procedure, kan de gebruiker de opgeslagen procedure niet uitvoeren. In plaats daarvan moet de gebruiker de toegangsmodus Alle op verzamelingsniveau hebben om een opgeslagen procedure uit te voeren.

Eigenschap Beschrijving
id Vereist. Het is een eigenschap die door de gebruiker kan worden ingesteld. Dit is de unieke naam die wordt gebruikt om de opgeslagen procedure te identificeren. De id mag niet langer zijn dan 255 tekens.
Lichaam Vereist. Het is een eigenschap die door de gebruiker kan worden ingesteld. Het is de hoofdtekst van de opgeslagen procedure.
_Ontdoen Het is een door het systeem gegenereerde eigenschap. De resource-id (_rid) is een unieke id die ook hiërarchisch is per resourcestack in het resourcemodel. Deze wordt intern gebruikt voor de plaatsing en navigatie van de opgeslagen procedureresource.
_Ts Het is een door het systeem gegenereerde eigenschap. Hiermee wordt de tijdstempel van de resource voor het laatst bijgewerkt. De waarde is een tijdstempel.
_Zelf Het is een door het systeem gegenereerde eigenschap. Dit is de unieke adresseerbare URI voor de resource.
_etag Het is een door het systeem gegenereerde eigenschap die de resource-etag aangeeft die is vereist voor optimistisch gelijktijdigheidsbeheer.

Opgeslagen procedures kunnen gebruikmaken van de Cosmos DB JavaScript-SDK aan serverzijde om databasebewerkingen uit te voeren, zoals het maken, lezen, bijwerken, verwijderen en opvragen van documenten, evenals het lezen van de aanvraagbody en schrijven naar de antwoordtekst van de opgeslagen procedure. Zie de zelfstudie Programmeren aan de serverzijde van Cosmos DB voor meer informatie.

Hier volgt bijvoorbeeld een opgeslagen procedure voor 'Hallo wereld':

var helloWorldStoredProc = {  
    id: "helloWorld",  
    body: function () {  
        var context = getContext();  
        var response = context.getResponse();  
  
        response.setBody("Hello, World");  
    }  
}  
  

In het volgende voorbeeld wordt een document gemaakt in de opgeslagen procedure:

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

In het volgende voorbeeld worden twee items in een opgeslagen procedure gewisseld:

// JavaScript source code  
var exchangeItemsSproc = {  
    name: "exchangeItems",  
    body: function (playerId1, playerId2) {  
        var context = getContext();  
        var collection = context.getCollection();  
        var response = context.getResponse();  
  
        var player1Document, player2Document;  
  
        // query for players  
        var filterQuery = 'SELECT * FROM Players p where p.id  = "' + playerId1 + '"';  
        var accept = collection.queryDocuments(collection.getSelfLink(), filterQuery, {},  
            function (err, documents, responseOptions) {  
                if (err) throw new Error("Error" + err.message);  
  
                if (documents.length != 1) throw "Unable to find both names";  
                player1Document = documents[0];  
  
                var filterQuery2 = 'SELECT * FROM Players p where p.id = "' + playerId2 + '"';  
                var accept2 = collection.queryDocuments(collection.getSelfLink(), filterQuery2, {},  
                    function (err2, documents2, responseOptions2) {  
                        if (err2) throw new Error("Error" + err2.message);  
                        if (documents2.length != 1) throw "Unable to find both names";  
                        player2Document = documents2[0];  
                        swapItems(player1Document, player2Document);  
                        return;  
                    });  
                if (!accept2) throw "Unable to read player details, abort ";  
            });  
  
        if (!accept) throw "Unable to read player details, abort ";  
  
        // swap the two players’ items  
        function swapItems(player1, player2) {  
            var player1ItemSave = player1.item;  
            player1.item = player2.item;  
            player2.item = player1ItemSave;  
  
            var accept = collection.replaceDocument(player1._self, player1,  
                function (err, docReplaced) {  
                    if (err) throw "Unable to update player 1, abort ";  
  
                    var accept2 = collection.replaceDocument(player2._self, player2,  
                        function (err2, docReplaced2) {  
                            if (err) throw "Unable to update player 2, abort"  
                        });  
  
                    if (!accept2) throw "Unable to update player 2, abort";  
                });  
  
            if (!accept) throw "Unable to update player 1, abort";  
        }  
    }  
}  
  

Taken

U kunt de volgende bewerkingen uitvoeren met opgeslagen procedures:

Zie Azure Cosmos DB-programmering: Opgeslagen procedures, triggers en UDF's voor informatie over hoe opgeslagen procedures werken, waaronder het uitvoeren van een opgeslagen procedure.

Zie ook