你当前正在访问 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

另请参阅