Создание хранимых процедур
Azure Cosmos DB обеспечивает интегрированное с языком выполнение транзакций JavaScript, которое позволяет записывать хранимые процедуры, триггерыи определяемые пользователем функции (ОПФ). Чтобы вызвать хранимую процедуру, триггер или определяемую пользователем функцию, необходимо зарегистрировать ее. Дополнительные сведения см. в статье Как работать с хранимыми процедурами, триггерами, определяемыми пользователем функциями в Azure Cosmos DB.
Заметка
В этом уроке рассматриваются хранимые процедуры, в следующем уроке рассматриваются триггеры и определяемые пользователем функции.
Написание хранимых процедур
Хранимые процедуры могут создавать, обновлять, читать, запрашивать и удалять элементы в контейнере Azure Cosmos. Хранимые процедуры регистрируются для каждой коллекции и могут работать с любым документом или вложением, находящимся в этой коллекции.
Ниже приведена простая хранимая процедура, которая возвращает ответ Hello World.
var helloWorldStoredProc = {
id: "helloWorld",
serverScript: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
Объект контекста предоставляет доступ ко всем операциям, которые могут выполняться в Azure Cosmos DB, и доступ к объектам запроса и ответа. В этом случае объект ответа используется для задания текста ответа, отправляемого клиенту.
Создание элемента с помощью хранимой процедуры
При создании элемента с помощью хранимой процедуры элемент вставляется в контейнер Azure Cosmos DB и возвращается идентификатор только что созданного элемента. Создание элемента является асинхронной операцией и зависит от функций обратного вызова JavaScript. Функция обратного вызова имеет два параметра: один для объекта ошибки в случае сбоя операции, а другой — для возвращаемого значения, в данном случае созданный объект. Внутри обратного вызова можно обрабатывать исключение или вызывать ошибку. Если обратный вызов не указан и возникает ошибка, среда выполнения Azure Cosmos DB выдает ошибку.
Хранимая процедура также включает параметр, который позволяет задавать описание в виде логического значения. Если параметр имеет значение true, а описание отсутствует, хранимая процедура создает исключение. В противном случае остальная часть хранимой процедуры продолжает выполняться.
Эта хранимая процедура принимает в качестве входных documentToCreate
, текст документа, который будет создан в текущей коллекции. Все такие операции являются асинхронными и зависят от обратных вызовов функций JavaScript.
var createDocumentStoredProc = {
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;
}
}
Массивы в качестве входных параметров для хранимых процедур
При определении хранимой процедуры на портале Azure входные параметры всегда отправляются в виде строки в хранимую процедуру. Даже если вы передаете массив строк в качестве входных данных, массив преобразуется в строку и отправляется в хранимую процедуру. Чтобы обойти эту проблему, можно определить функцию в хранимой процедуре, чтобы проанализировать строку как массив. В следующем коде показано, как проанализировать строковый входной параметр в виде массива:
function sample(arr) {
if (typeof arr === "string") arr = JSON.parse(arr);
arr.forEach(function(a) {
// do something here
console.log(a);
});
}
Ограниченное выполнение
Все операции Azure Cosmos DB должны выполняться в течение ограниченного времени. Хранимые процедуры имеют ограниченное время выполнения на сервере. Все функции коллекции возвращают логическое значение, представляющее, завершается ли эта операция или нет
Транзакции в хранимых процедурах
Транзакции с элементами в контейнере можно реализовать с помощью хранимой процедуры. Функции JavaScript могут реализовать модель на основе продолжения для пакетного выполнения или возобновления выполнения. Значение продолжения может быть любым значением вашего выбора, и ваши приложения могут использовать это значение для возобновления транзакции с новой начальной точки. На следующей схеме показано, как модель продолжения транзакций может использоваться для повторения серверной функции, пока функция не завершит всю рабочую нагрузку обработки.