Vytvoření uložených procedur
Azure Cosmos DB poskytuje jazykově integrované transakční spouštění JavaScriptu, které umožňuje psát uložené procedury, triggerya uživatelem definované funkce (UDF). Pokud chcete volat uloženou proceduru, trigger nebo uživatelem definovanou funkci, musíte ji zaregistrovat. Další informace najdete v tématu Jak pracovat s uloženými procedurami, triggery, uživatelem definovanými funkcemi ve službě Azure Cosmos DB.
Poznámka
Tato lekce se zaměřuje na uložené procedury. Následující lekce se zabývá triggery a uživatelem definovanými funkcemi.
Zápis uložených procedur
Uložené procedury můžou vytvářet, aktualizovat, číst, dotazovat a odstraňovat položky uvnitř kontejneru Azure Cosmos. Uložené procedury jsou registrovány na kolekci a mohou pracovat s libovolným dokumentem nebo přílohou, která je v této kolekci.
Tady je jednoduchá uložená procedura, která vrací odpověď "Hello World".
var helloWorldStoredProc = {
id: "helloWorld",
serverScript: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
Kontextový objekt poskytuje přístup ke všem operacím, které je možné provádět ve službě Azure Cosmos DB, a přístup k objektům požadavků a odpovědí. V tomto případě použijete objekt odpovědi k nastavení textu odpovědi, která se má odeslat zpět klientovi.
Vytvoření položky pomocí uložené procedury
Když vytvoříte položku pomocí uložené procedury, položka se vloží do kontejneru Azure Cosmos DB a vrátí se ID nově vytvořené položky. Vytvoření položky je asynchronní operace a závisí na funkcích zpětného volání JavaScriptu. Funkce zpětného volání má dva parametry: jeden pro objekt chyby v případě selhání operace a druhý pro návratovou hodnotu, v tomto případě vytvořený objekt. Uvnitř zpětného volání můžete zpracovat výjimku nebo vyvolat chybu. Pokud zpětné volání není k dispozici a dojde k chybě, modul runtime Služby Azure Cosmos DB vyvolá chybu.
Uložená procedura obsahuje také parametr, který nastaví popis jako logickou hodnotu. Pokud je parametr nastaven na hodnotu true a popis chybí, uložená procedura vyvolá výjimku. Jinak zbytek uložené procedury pokračuje v běhu.
Tato uložená procedura přebírá documentToCreate
jako vstup, což je text dokumentu, který se má vytvořit v aktuální kolekci. Všechny tyto operace jsou asynchronní a závisí na zpětných voláních funkcí JavaScriptu.
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;
}
}
Pole jako vstupní parametry pro uložené procedury
Při definování uložené procedury na webu Azure Portal se vstupní parametry vždy odesílají jako řetězec do uložené procedury. I když jako vstup předáte pole řetězců, pole je převedeno na řetězec a odesláno k uložené proceduře. Pokud chcete tento problém obejít, můžete definovat funkci v rámci uložené procedury pro parsování řetězce jako pole. Následující kód ukazuje, jak analyzovat vstupní parametr řetězce jako pole:
function sample(arr) {
if (typeof arr === "string") arr = JSON.parse(arr);
arr.forEach(function(a) {
// do something here
console.log(a);
});
}
Ohraničené spuštění
Všechny operace Azure Cosmos DB se musí dokončit v omezeném časovém intervalu. Uložené procedury mají omezenou dobu spuštění na serveru. Všechny funkce kolekce vrací logickou hodnotu, která představuje, jestli se tato operace dokončila, nebo ne.
Transakce v rámci uložených procedur
Transakce u položek v kontejneru můžete implementovat pomocí uložené procedury. JavaScriptové funkce mohou implementovat model založený na kontinuaci pro dávkové zpracování nebo obnovení provádění. Hodnota pokračování může být libovolná hodnota podle vašeho výběru a aplikace pak mohou tuto hodnotu použít k obnovení transakce z nového výchozího bodu. Následující diagram znázorňuje, jak lze model pokračování transakce použít k opakování funkce na straně serveru, dokud funkce nedokončí celou úlohu zpracování.