Uložené procedury

Azure Cosmos DB je globálně distribuovaná databáze s více modely, která podporuje modely dokumentů, grafů a datových modelů klíč-hodnota. Obsah v této části je určený k vytváření, dotazování a správě prostředků dokumentů pomocí rozhraní SQL API přes REST.

Uložená procedura je část aplikační logiky napsaná v JavaScriptu, která je registrována a spuštěna v kolekci jako jedna transakce. Ve službě Azure Cosmos DB je JavaScript hostovaný ve stejném paměťovém prostoru jako databáze. Proto se požadavky provedené v rámci uložených procedur spouštějí ve stejném rozsahu jako relace databáze. Tento proces umožňuje službě Azure Cosmos DB zaručit acid pro všechny operace, které jsou součástí jedné uložené procedury.

Prostředek uložené procedury je reprezentován sprocs v modelu prostředků Azure Cosmos DB.

Prostředek uložené procedury má pevné schéma. Vlastnost body obsahuje logiku aplikace. Následující příklad znázorňuje konstruktor JSON uložené procedury.

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

Pouze režim přístupu All pro konkrétní uloženou proceduru neumožňuje uživateli spustit uloženou proceduru. Místo toho uživatel musí mít režim Přístupu na úrovni kolekce, aby mohl spustit uloženou proceduru.

Vlastnost Popis
id Povinná hodnota. Jedná se o uživatelskou nastavitelnou vlastnost. Jedná se o jedinečný název, který se používá k identifikaci uložené procedury. ID nesmí být delší než 255 znaků.
Tělo Povinná hodnota. Jedná se o uživatelskou nastavitelnou vlastnost. Je to tělo uložené procedury.
_Zbavit Jedná se o systémově vygenerovanou vlastnost. ID prostředku (_rid) je jedinečný identifikátor, který je také hierarchický podle zásobníku prostředků v modelu prostředků. Používá se interně k umístění a navigaci prostředku uložené procedury.
_Ts Jedná se o systémově vygenerovanou vlastnost. Určuje časové razítko poslední aktualizace prostředku. Hodnota je časové razítko.
_Vlastní Jedná se o systémově vygenerovanou vlastnost. Jedná se o jedinečný adresovatelný identifikátor URI prostředku.
_Etag Jedná se o systémově vygenerovanou vlastnost, která určuje etag prostředku vyžadovanou pro řízení optimistické souběžnosti.

Uložené procedury můžou používat sadu JavaScript SDK služby Cosmos DB na straně serveru k provádění databázových operací, jako je vytváření, čtení, aktualizace, odstraňování a dotazování dokumentů, a také čtení z textu požadavku a zápis do textu odpovědi uložené procedury. Další informace najdete v kurzu programování na straně serveru Cosmos DB.

Tady je například uložená procedura pro "Hello World":

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

Následující příklad vytvoří dokument uvnitř uložené procedury:

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

Následující příklad prohodí dvě položky uvnitř uložené procedury:

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

Úlohy

S uloženými procedurami můžete provádět následující operace:

Informace o tom, jak fungují uložené procedury, včetně spuštění uložené procedury, najdete v tématu Programování v Azure Cosmos DB: Uložené procedury, triggery a UDF.

Viz také