Поделиться через


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

ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL

API для NoSQL в Azure Cosmos DB поддерживает регистрацию и вызов хранимых процедур, триггеров и определяемых пользователем функций (UDFS), написанных на JavaScript. После определения одной или нескольких хранимых процедур, триггеров или определяемых пользователем функций их можно загрузить и просмотреть на портале Azure с помощью обозревателя данных.

API для NoSQL SDK можно использовать на нескольких платформах, включая .NET версии 2 (устаревшую версию), .NET версии 3, Java, JavaScript или Python наборы SDK для выполнения этих задач. Если вы еще не работали с одним из этих пакетов SDK, ознакомьтесь со статьей краткого руководства по соответствующему пакету SDK:

Пакет SDK Быстрый старт
.NET (версия 3) клиентская библиотека Azure Cosmos DB для NoSQL для .NET
Ява Создание приложения Java для управления Azure Cosmos DB для NoSQL данных
JavaScript Клиентская библиотека Azure Cosmos DB для NoSQL для Node.js
Питон Клиентская библиотека 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, см. в разделе "Предварительные триггеры".

При выполнении операции, указав 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 v2.

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);

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

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

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