共用方式為


預存程序

Azure Cosmos DB 是一個全域散發的多模型資料庫,可支援檔、圖形和索引鍵值資料模型。 本節中的內容是透過 REST 建立、查詢及管理檔資源。

預存程序是一種以針對集合註冊並視為單一交易執行的 JavaScript 撰寫的應用程式邏輯。 在 Azure Cosmos DB 中,JavaScript 裝載于與資料庫相同的記憶體空間中。 因此,在預存程序中所提出的要求會在相同的資料庫工作階段範圍中執行。 此程式可讓 Azure Cosmos DB 保證所有屬於單一預存程式的作業 ACID。

預存程式資源是由 Azure Cosmos DB 資源模型中的 sproc 表示。

預存程序資源有固定的結構描述。 主體屬性包含應用程式邏輯。 下列範例說明預存程序的 JSON 結構。

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

只有特定預存程式的 [所有存取模式 ] 不允許使用者執行預存程式。 相反地,使用者必須擁有集合層級的 All 存取模式 ,才能執行預存程式。

屬性 描述
id 必要。 它是使用者可設定的屬性。 它是用來識別預存程序的唯一名稱。 識別碼不能超過 255 個字元。
body 必要。 它是使用者可設定的屬性。 它是預存程式的主體。
_擺脫 它是系統產生的屬性。 資源識別碼 (_rid) 是資源模型上每個資源堆疊的階層式唯一識別碼。 在內部用來放置和導覽預存程序資源。
_Ts 它是系統產生的屬性。 代表資源的上次更新時間戳記。 值為時間戳記。
_自我 它是系統產生的屬性。 代表資源的唯一可定址 URI。
_Etag 它是系統產生的屬性,指定開放式並行控制所需的資源 etag。

預存程式可以使用 Cosmos DB JavaScript 伺服器端 SDK 來建立、讀取、更新、刪除和查詢檔等資料庫作業,以及從要求本文讀取,以及寫入預存程式的回應本文。 如需詳細資訊,請參閱 Cosmos DB 伺服器端程式設計教學課程

例如,以下是「Hello World」預存程序:

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

下列範例會建立預存程序內的文件:

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

下列範例會交換預存程序內的兩個項目:

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

工作

您可以使用預存程式執行下列作業:

如需預存程式運作方式的詳細資訊,包括執行預存程式,請參閱 Azure Cosmos DB 程式設計:預存程式、觸發程式和 UDF

另請參閱