預存程序
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。