Prosedur Tersimpan

Azure Cosmos DB adalah database multi-model yang didistribusikan secara global yang mendukung model data dokumen, grafik, dan nilai kunci. Konten di bagian ini adalah untuk membuat, mengkueri, dan mengelola sumber daya dokumen menggunakan SQL API melalui REST.

Prosedur tersimpan adalah bagian dari logika aplikasi yang ditulis dalam JavaScript yang terdaftar dan dijalankan terhadap koleksi sebagai satu transaksi. Di Azure Cosmos DB, JavaScript dihosting di ruang memori yang sama dengan database. Oleh karena itu, permintaan yang dibuat dalam prosedur tersimpan dijalankan dalam cakupan sesi database yang sama. Proses ini memungkinkan Azure Cosmos DB menjamin ACID untuk semua operasi yang merupakan bagian dari satu prosedur tersimpan.

Sumber daya prosedur tersimpan diwakili oleh sproc dalam model sumber daya Azure Cosmos DB.

Sumber daya prosedur tersimpan memiliki skema tetap. Properti isi berisi logika aplikasi. Contoh berikut mengilustrasikan konstruksi JSON dari prosedur tersimpan.

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

Hanya memiliki Semua mode akses untuk prosedur tersimpan tertentu tidak memungkinkan pengguna untuk menjalankan prosedur tersimpan. Sebagai gantinya, pengguna harus memiliki semua mode akses di tingkat koleksi untuk menjalankan prosedur tersimpan.

Properti Deskripsi
id Wajib diisi. Ini adalah properti yang dapat diatur pengguna. Ini adalah nama unik yang digunakan untuk mengidentifikasi prosedur tersimpan. Id tidak boleh melebihi 255 karakter.
isi Wajib diisi. Ini adalah properti yang dapat diatur pengguna. Ini adalah isi prosedur tersimpan.
_rid Ini adalah properti yang dihasilkan sistem. ID sumber daya (_rid) adalah pengidentifikasi unik yang juga hierarkis per tumpukan sumber daya pada model sumber daya. Ini digunakan secara internal untuk penempatan dan navigasi sumber daya prosedur tersimpan.
_Ts Ini adalah properti yang dihasilkan sistem. Ini menentukan tanda waktu terakhir yang diperbarui dari sumber daya. Nilainya adalah tanda waktu.
_self Ini adalah properti yang dihasilkan sistem. Ini adalah URI unik yang dapat diatasi untuk sumber daya.
_etag Ini adalah properti yang dihasilkan sistem yang menentukan etag sumber daya yang diperlukan untuk kontrol konkurensi optimis.

Prosedur tersimpan dapat menggunakan Cosmos DB JavaScript Server-side SDK untuk membuat operasi database seperti membuat, membaca, memperbarui, menghapus, dan mengkueri dokumen, serta membaca dari isi permintaan dan menulis ke isi respons prosedur tersimpan. Untuk informasi selengkapnya, lihat tutorial pemrograman sisi server Cosmos DB.

Misalnya, berikut adalah prosedur tersimpan untuk "Halo Dunia":

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

Contoh berikut membuat dokumen di dalam prosedur tersimpan:

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

Contoh berikut menukar dua item di dalam prosedur tersimpan:

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

Tugas

Anda dapat melakukan operasi berikut dengan prosedur tersimpan:

Untuk informasi tentang cara kerja prosedur tersimpan, termasuk eksekusi prosedur tersimpan, lihat Pemrograman Azure Cosmos DB: Prosedur tersimpan, pemicu, dan UDF.

Lihat juga