Как зарегистрировать и использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB
Статья
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
API для NoSQL в Azure Cosmos DB поддерживает регистрацию и вызов хранимых процедур, триггеров и определяемых пользователем функций (UDFS), написанных на JavaScript. После определения одной или нескольких хранимых процедур, триггеров или определяемых пользователем функций можно загрузить и просмотреть их в портал Azure с помощью Обозревателя данных.
Api for NoSQL SDK можно использовать на нескольких платформах, включая .NET версии 2 (устаревшую версию), .NET версии 3, Java, JavaScript или пакеты SDK Python для выполнения этих задач. Если вы еще не работали с одним из этих пакетов SDK, ознакомьтесь со статьей краткого руководства по соответствующему пакету SDK:
В следующих примерах кода предполагается, что у вас уже есть client и container переменные. Если необходимо создать эти переменные, обратитесь к соответствующему краткому руководству для платформы.
Выполнение хранимых процедур
Хранимые процедуры написаны с использованием JavaScript. Они могут создавать, обновлять, читать, запрашивать и удалять элементы в контейнере Azure Cosmos DB. Дополнительные сведения см. в разделе "Как писать хранимые процедуры".
В следующих примерах показано, как регистрировать и вызывать хранимую процедуру с помощью пакетов SDK для Azure Cosmos DB. Источник для этой хранимой процедуры, сохраненный как spCreateToDoItem.js, см. в разделе "Создание элементов с помощью хранимых процедур".
Примечание.
Для секционированных контейнеров при выполнении хранимой процедуры необходимо указать значение ключа секции в параметрах запроса. Хранимые процедуры всегда ограничиваются ключом секции. Элементы, имеющие другое значение ключа секции, не видны хранимой процедуре. Этот принцип также применяется к триггерам.
В коде ниже показано, как правильно вызывать хранимую процедуру с помощью пакета SDK для Python.
import uuid
new_id= str(uuid.uuid4())
# Creating a document for a container with "id" as a partition key.
new_item = {
"id": new_id,
"category":"Personal",
"name":"Groceries",
"description":"Pick up strawberries",
"isComplete":False
}
result = container.scripts.execute_stored_procedure(sproc=created_sproc,params=[new_item], partition_key=new_id)
Запуск предварительной подготовки
В следующих примерах показано, как зарегистрировать и вызвать предварительную команду с помощью пакетов SDK Для Azure Cosmos DB. Источник этого примера предварительной подготовки, сохраненный как trgPreValidateToDoItemTimestamp.js, см. в разделе Pretriggers.
При выполнении операции путем PreTriggerInclude указания и передачи имени триггера в List объекте претригаторы передаются в RequestOptions объект.
Примечание.
Несмотря на то, что имя триггера передается как одно List, вы по-прежнему можете запускать только один триггер для каждой операции.
В следующем коде показано, как вызвать претриггер с помощью пакета SDK для Python:
item = {'category': 'Personal', 'name': 'Groceries',
'description': 'Pick up strawberries', 'isComplete': False}
result = container.create_item(item, pre_trigger_include='trgPreValidateToDoItemTimestamp')
Как выполнять триггеры после операции
В следующих примерах показано, как регистрировать триггер после операции с помощью пакетов SDK для Azure Cosmos DB. Источник этого примера после триггера, сохраненного как trgPostUpdateMetadata.js, см. в разделе "Триггеры после активации"
В следующих примерах показано, как зарегистрировать определяемую пользователем функцию с помощью пакетов SDK для Azure Cosmos DB. Источник этого пользовательского примера функции, сохраненного как udfTax.js, см. в разделе "Как записывать определяемые пользователем функции".
Ниже показано, как зарегистрировать определяемую пользователем функцию с помощью пакета SDK для .NET версии 2.
string udfId = "Tax";
var udfTax = new UserDefinedFunction
{
Id = udfId,
Body = File.ReadAllText($@"..\js\{udfId}.js")
};
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateUserDefinedFunctionAsync(containerUri, udfTax);
Ниже показано, как вызывать определяемую пользователем функцию с помощью пакета SDK для .NET версии 2.
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
var results = client.CreateDocumentQuery<dynamic>(containerUri, "SELECT * FROM Incomes t WHERE udf.Tax(t.income) > 20000"));
foreach (var result in results)
{
//iterate over results
}
Ниже показано, как зарегистрировать определяемую пользователем функцию с помощью пакета SDK для .NET версии 3.
await client.GetContainer("database", "container").Scripts.CreateUserDefinedFunctionAsync(new UserDefinedFunctionProperties
{
Id = "Tax",
Body = File.ReadAllText(@"..\js\Tax.js")
});
Ниже показано, как вызывать определяемую пользователем функцию с помощью пакета SDK для .NET версии 3.
var iterator = client.GetContainer("database", "container").GetItemQueryIterator<dynamic>("SELECT * FROM Incomes t WHERE udf.Tax(t.income) > 20000");
while (iterator.HasMoreResults)
{
var results = await iterator.ReadNextAsync();
foreach (var result in results)
{
//iterate over results
}
}
Ниже показано, как зарегистрировать определяемую пользователем функцию с помощью пакета SDK для Java:
Ниже показано, как вызывать определяемую пользователем функцию с помощью пакета SDK для Python:
results = list(container.query_items(
'query': 'SELECT * FROM Incomes t WHERE udf.Tax(t.income) > 20000'))
Следующие шаги
Дополнительные сведения о том, как записать или использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB, см. в статьях ниже: