Partilhar via


Como registar e usar procedimentos armazenados, triggers e funções definidas pelo utilizador no Azure Cosmos DB

A API para NoSQL no Azure Cosmos DB suporta o registo e invocação de procedimentos armazenados, triggers e funções definidas pelo utilizador (UDFs) escritas em JavaScript. Depois de definir um ou mais procedimentos armazenados, triggers ou UDFs, pode carregá-los e visualizá-los no portal Azure usando o Data Explorer.

Pode usar a API do SDK NoSQL em várias plataformas, incluindo .NET v2 (legacy), .NET v3, Java, JavaScript ou Python SDKs para realizar estas tarefas. Se nunca trabalhou com um destes SDKs antes, veja o artigo de início rápido para o SDK apropriado:

SDK Início Rápido
.NET v3 Azure Cosmos DB for NoSQL client library for .NET
Java Construa uma aplicação Java para gerir o Azure Cosmos DB para dados NoSQL
JavaScript Azure Cosmos DB for NoSQL client library for Node.js
Python Biblioteca de cliente Azure Cosmos DB para NoSQL para Python

Importante

Os exemplos de código seguintes assumem que já tens client variáveis e container . Se precisar de criar essas variáveis, consulte o quickstart apropriado para a sua plataforma.

Como executar procedimentos armazenados

Os procedimentos armazenados são escritos usando JavaScript. Podem criar, atualizar, ler, consultar e eliminar itens dentro de um contentor Azure Cosmos DB. Para mais informações, veja Como escrever procedimentos armazenados.

Os exemplos seguintes mostram como registar e chamar um procedimento armazenado usando os SDKs do Azure Cosmos DB. Para a fonte deste exemplo, guardada como spCreateToDoItem.js, veja Criar itens usando procedimentos armazenados.

Observação

Para contentores particionados, quando executa um procedimento armazenado, deve fornecer um valor de chave de partição nas opções de pedido. Os procedimentos armazenados estão sempre associados a uma chave de partição. Itens que têm um valor de chave de partição diferente não são visíveis para o procedimento armazenado. Este princípio aplica-se também aos gatilhos.

O exemplo seguinte mostra como registar um procedimento armazenado usando o .NET SDK v2:

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;

O código seguinte mostra como chamar um procedimento armazenado usando o .NET SDK v2:

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

Como executar pré-triggers

Os exemplos seguintes mostram como registar e chamar um pré-trigger usando os SDKs do Azure Cosmos DB. Para a origem deste exemplo pré-trigger, guardado como trgPreValidateToDoItemTimestamp.js, veja Pre-triggers.

Quando executas uma operação especificando PreTriggerInclude e depois passando o nome do trigger num List objeto, os pré-triggers são passados no RequestOptions objeto.

Observação

Mesmo que o nome do gatilho seja passado como um List, ainda podes executar apenas um gatilho por operação.

O código seguinte mostra como registar um pré-trigger usando o .NET SDK v2:

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

O código seguinte mostra como chamar um pré-trigger usando o .NET SDK v2:

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

Como correr após os gatilhos

Os exemplos seguintes mostram como registar um pós-trigger usando os SDKs do Azure Cosmos DB. Para a origem deste exemplo pós-trigger, guardado como trgPostUpdateMetadata.js, consulte Post-triggers

O seguinte código mostra como registar um pós-acionador usando o .NET SDK 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);

O código seguinte mostra como chamar um post-trigger usando o .NET SDK v2:

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

Como trabalhar com funções definidas pelo utilizador

Os exemplos seguintes mostram como registar um UDF usando os SDKs do Azure Cosmos DB. Para a origem deste exemplo, guardada como udfTax.js, veja Como escrever funções definidas pelo utilizador.

O código seguinte mostra como registar uma função definida pelo utilizador usando o .NET SDK v2:

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

O código seguinte mostra como chamar uma função definida pelo utilizador usando o .NET SDK v2:

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
}

Próximos passos