Aracılığıyla paylaş


Saklı Yordamlar

Azure Cosmos DB , belge, grafik ve anahtar-değer veri modellerini destekleyen genel olarak dağıtılmış çok modelli bir veritabanıdır. Bu bölümdeki içerik, REST aracılığıyla SQL API'sini kullanarak belge kaynaklarını oluşturmaya, sorgulamaya ve yönetmeye yöneliktir.

Saklı yordam, JavaScript'te yazılmış, tek bir işlem olarak bir koleksiyona kaydedilmiş ve yürütülen bir uygulama mantığıdır. Azure Cosmos DB'de JavaScript, veritabanıyla aynı bellek alanında barındırılır. Bu nedenle, saklı yordamlar içinde yapılan istekler veritabanı oturumunun aynı kapsamında yürütülür. Bu işlem, Azure Cosmos DB'nin tek bir saklı yordamın parçası olan tüm işlemler için ACID garantisi vermesine olanak tanır.

Saklı yordam kaynağı, Azure Cosmos DB kaynak modelindekiprocs ile temsil edilir.

Saklı yordam kaynağının sabit bir şeması vardır. Body özelliği uygulama mantığını içerir. Aşağıdaki örnekte saklı yordamın JSON yapısı gösterilmektedir.

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

Yalnızca belirli bir saklı yordam için Tüm erişim modunun olması kullanıcının saklı yordamı yürütmesine izin vermez. Bunun yerine, kullanıcının saklı yordamı yürütmek için koleksiyon düzeyinde Tüm erişim moduna sahip olması gerekir.

Özellik Açıklama
id Gereklidir. Bu bir kullanıcı ayarlanabilir özelliğidir. Saklı yordamı tanımlamak için kullanılan benzersiz addır. Kimlik 255 karakteri aşmamalıdır.
Vücut Gereklidir. Bu bir kullanıcı ayarlanabilir özelliğidir. Saklı yordamın gövdesidir.
_Kurtulmak Sistem tarafından oluşturulan bir özelliktir. Kaynak kimliği (_rid), kaynak modelinde kaynak yığını başına da hiyerarşik olan benzersiz bir tanımlayıcıdır. Saklı yordam kaynağının yerleşimi ve gezintisi için dahili olarak kullanılır.
_Ts Sistem tarafından oluşturulan bir özelliktir. Kaynağın son güncelleştirilmiş zaman damgasını belirtir. Değer bir zaman damgasıdır.
_Kendini Sistem tarafından oluşturulan bir özelliktir. Kaynak için benzersiz adreslenebilir URI'dir.
_Etag İyimser eşzamanlılık denetimi için gereken kaynak etag'ini belirten sistem tarafından oluşturulan bir özelliktir.

Saklı yordamlar, belgeleri oluşturma, okuma, güncelleştirme, silme ve sorgulama gibi veritabanı işlemlerinin yanı sıra istek gövdesinden okuma ve saklı yordamın yanıt gövdesine yazma işlemleri yapmak için Cosmos DB JavaScript Sunucu tarafı SDK'sını kullanabilir. Daha fazla bilgi için Bkz. Cosmos DB sunucu tarafı programlama öğreticisi.

Örneğin, "Merhaba Dünya" için bir saklı yordam aşağıda verilmiştir:

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

Aşağıdaki örnek saklı yordamın içinde bir belge oluşturur:

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

Aşağıdaki örnek, saklı yordamın içindeki iki öğeyi değiştirmektedir:

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

Görevler

Saklı yordamlarla aşağıdaki işlemleri yapabilirsiniz:

Saklı yordam yürütme de dahil olmak üzere saklı yordamların nasıl çalıştığı hakkında bilgi için bkz. Azure Cosmos DB programlama: Saklı yordamlar, tetikleyiciler ve UDF'ler.

Ayrıca Bkz.