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

SDK Начало работы
.NET (версия 3) Краткое руководство. Клиентская библиотека Azure Cosmos DB для NoSQL для .NET
Java Краткое руководство. Создание приложения Java для управления данными Azure Cosmos DB для NoSQL
JavaScript Краткое руководство. Клиентская библиотека Azure Cosmos DB для NoSQL для Node.js
Python Краткое руководство. Клиентская библиотека Azure Cosmos DB для NoSQL для Python

Важно!

В следующих примерах кода предполагается, что у вас уже есть client и container переменные. Если необходимо создать эти переменные, обратитесь к соответствующему краткому руководству для платформы.

Выполнение хранимых процедур

Хранимые процедуры написаны с использованием JavaScript. Они могут создавать, обновлять, читать, запрашивать и удалять элементы в контейнере Azure Cosmos DB. Дополнительные сведения см. в разделе "Как писать хранимые процедуры".

В следующих примерах показано, как регистрировать и вызывать хранимую процедуру с помощью пакетов SDK для Azure Cosmos DB. Источник для этой хранимой процедуры, сохраненный как spCreateToDoItem.js, см. в разделе "Создание элементов с помощью хранимых процедур".

Примечание.

Для секционированных контейнеров при выполнении хранимой процедуры необходимо указать значение ключа секции в параметрах запроса. Хранимые процедуры всегда ограничиваются ключом секции. Элементы, имеющие другое значение ключа секции, не видны хранимой процедуре. Этот принцип также применяется к триггерам.

Ниже показано, как правильно зарегистрировать хранимую процедуру с помощью пакета SDK для .NET версии 2.

string storedProcedureId = "spCreateToDoItems";
StoredProcedure newStoredProcedure = new StoredProcedure
   {
       Id = storedProcedureId,
       Body = File.ReadAllText($@"..\js\{storedProcedureId}.js")
   };
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
var response = await client.CreateStoredProcedureAsync(containerUri, newStoredProcedure);
StoredProcedure createdStoredProcedure = response.Resource;

В коде ниже показано, как правильно вызывать хранимую процедуру с помощью пакета SDK для .NET версии 2.

dynamic[] newItems = new dynamic[]
{
    new {
        category = "Personal",
        name = "Groceries",
        description = "Pick up strawberries",
        isComplete = false
    },
    new {
        category = "Personal",
        name = "Doctor",
        description = "Make appointment for check up",
        isComplete = false
    }
};

Uri uri = UriFactory.CreateStoredProcedureUri("myDatabase", "myContainer", "spCreateToDoItem");
RequestOptions options = new RequestOptions { PartitionKey = new PartitionKey("Personal") };
var result = await client.ExecuteStoredProcedureAsync<string>(uri, options, new[] { newItems });

Запуск предварительной подготовки

В следующих примерах показано, как зарегистрировать и вызвать предварительную команду с помощью пакетов SDK Для Azure Cosmos DB. Источник этого примера предварительной подготовки, сохраненный как trgPreValidateToDoItemTimestamp.js, см. в разделе Pretriggers.

При выполнении операции путем PreTriggerInclude указания и передачи имени триггера в List объекте претригаторы передаются в RequestOptions объект.

Примечание.

Несмотря на то, что имя триггера передается как одно List, вы по-прежнему можете запускать только один триггер для каждой операции.

В следующем коде показано, как зарегистрировать предварительную версию пакета SDK для .NET версии 2:

string triggerId = "trgPreValidateToDoItemTimestamp";
Trigger trigger = new Trigger
{
    Id =  triggerId,
    Body = File.ReadAllText($@"..\js\{triggerId}.js"),
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Pre
};
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateTriggerAsync(containerUri, trigger);

В следующем коде показано, как вызвать претриггер с помощью пакета SDK для .NET версии 2:

dynamic newItem = new
{
    category = "Personal",
    name = "Groceries",
    description = "Pick up strawberries",
    isComplete = false
};

Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
RequestOptions requestOptions = new RequestOptions { PreTriggerInclude = new List<string> { "trgPreValidateToDoItemTimestamp" } };
await client.CreateDocumentAsync(containerUri, newItem, requestOptions);

Как выполнять триггеры после операции

В следующих примерах показано, как регистрировать триггер после операции с помощью пакетов SDK для Azure Cosmos DB. Источник этого примера после триггера, сохраненного как trgPostUpdateMetadata.js, см. в разделе "Триггеры после активации"

Ниже показано, как зарегистрировать триггер после операции с помощью пакета SDK для .NET версии 2.

string triggerId = "trgPostUpdateMetadata";
Trigger trigger = new Trigger
{
    Id = triggerId,
    Body = File.ReadAllText($@"..\js\{triggerId}.js"),
    TriggerOperation = TriggerOperation.Create,
    TriggerType = TriggerType.Post
};
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.CreateTriggerAsync(containerUri, trigger);

Ниже показано, как вызывать триггер после операции с помощью пакета SDK для .NET версии 2.

var newItem = { 
    name: "artist_profile_1023",
    artist: "The Band",
    albums: ["Hellujah", "Rotators", "Spinning Top"]
};

RequestOptions options = new RequestOptions { PostTriggerInclude = new List<string> { "trgPostUpdateMetadata" } };
Uri containerUri = UriFactory.CreateDocumentCollectionUri("myDatabase", "myContainer");
await client.createDocumentAsync(containerUri, newItem, options);

Работа с определяемыми пользователем функциями

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

Следующие шаги

Дополнительные сведения о том, как записать или использовать хранимые процедуры, триггеры и определяемые пользователем функции в Azure Cosmos DB, см. в статьях ниже: