Хранимые процедуры
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: хранимые процедуры, триггеры и определяемые пользователем функции.