你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
存储过程
Azure Cosmos DB 是一个全球分布式多模型数据库,支持文档、图形和键值数据模型。 本部分中的内容用于通过 REST 使用 SQL API 创建、查询和管理文档资源。
存储过程是一个用 JavaScript 编写的应用程序逻辑,是作为单个事务注册并对集合执行的。 在 Azure Cosmos DB 中,JavaScript 托管在与数据库相同的内存空间中。 因此,存储过程内发出的请求在同一个数据库会话作用域中执行。 此过程使 Azure Cosmos DB 能够保证属于单个存储过程的所有操作的 ACID。
存储过程资源由 Azure Cosmos DB 资源模型中的 sproc 表示。
存储过程资源具有固定的架构。 body 属性包含应用程序逻辑。 以下示例演示了存储过程的 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 | 必需。 它是用户可设置的属性。 它是用来标识存储过程的唯一名称。 ID 不能超过 255 个字符。 |
body | 必需。 它是用户可设置的属性。 它是存储过程的主体。 |
_摆脱 | 它是系统生成的属性。 资源 ID (_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。