Хранимые процедуры

Azure Cosmos DB — это глобально распределенная база данных с несколькими моделями, которая поддерживает модели данных документов, графов и ключей и значений. Содержимое этого раздела предназначено для создания, запроса и управления ресурсами документов с помощью API SQL через REST.

Хранимая процедура — это написанная на JavaScript часть логики приложения, регистрируемая и выполняемая применительно к коллекции как одна транзакция. В Azure Cosmos DB JavaScript размещается в том же пространстве памяти, что и база данных. Поэтому запросы, входящие в состав хранимых процедур, выполняются в той же области сеанса работы с базой данных. Этот процесс позволяет Azure Cosmos DB гарантировать acid для всех операций, которые являются частью одной хранимой процедуры.

Ресурс хранимой процедуры представлен sprocs в модели ресурсов Azure Cosmos DB.

Ресурс хранимой процедуры имеет фиксированную схему. В тексте свойства содержится логика приложения. В следующем примере показана конструкция 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"  
}  
  

Просто наличие режима доступа "Все " для конкретной хранимой процедуры не позволяет пользователю выполнить хранимую процедуру. Вместо этого пользователь должен иметь режим доступа Все на уровне коллекции, чтобы выполнить хранимую процедуру.

Свойство Описание
идентификатор Обязательный. Это настраиваемое пользователем свойство. Это уникальное имя, используемое для идентификации хранимой процедуры. Длина идентификатора не должна превышать 255 символов.
body Обязательный. Это настраиваемое пользователем свойство. Это тело хранимой процедуры.
_rid Это свойство, созданное системой. Идентификатор ресурса (_rid) — это уникальный идентификатор, который также является иерархическим для стека ресурсов в модели ресурсов. Оно используется системой для размещения ресурса хранимой процедуры и перемещения по нему.
_Ts Это свойство, созданное системой. Оно представляет метку времени последнего обновления ресурса. Значение — метка времени.
_Самостоятельно Это свойство, созданное системой. Это уникальный адресуемый URI для ресурса.
_etag Это системное свойство, указывающее тег ресурса, необходимый для управления оптимистическим параллелизмом.

Хранимые процедуры могут использовать серверный пакет SDK JavaScript для Cosmos DB для выполнения таких операций базы данных, как создание, чтение, обновление, удаление и запрос документов, а также чтение из текста запроса и запись в текст ответа хранимой процедуры. Дополнительные сведения см. в руководстве по программированию на стороне сервера 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: хранимые процедуры, триггеры и определяемые пользователем функции.

См. также: