Registro y uso de procedimientos almacenados, desencadenadores y funciones definidas por el usuario en Azure Cosmos DB

SE APLICA A: NoSQL

La API para NoSQL en Azure Cosmos DB admite el registro e invocación de procedimientos almacenados, desencadenadores y funciones definidas por el usuario (UDF) escritas en JavaScript. Después de que defina uno o varios procedimientos, desencadenadores y funciones definidas por el usuario, puede cargarlos y verlos en Azure Portal mediante Data Explorer.

Puede usar el SDK de API para NoSQL en varias plataformas, como los SDK de .NET v2 (heredado), .NET v3, Java, JavaScript o Python para realizar estas tareas. Si no ha trabajado con uno de estos SDK antes, consulte el artículo Inicio rápido para ver el SDK adecuado:

SDK Introducción
.NET v3 Inicio rápido: Biblioteca cliente de Azure Cosmos DB for NoSQL para .NET
Java Inicio rápido: Creación de una aplicación Java para administrar los datos de Azure Cosmos DB for NoSQL
JavaScript Inicio rápido: Biblioteca cliente de Azure Cosmos DB for NoSQL para Node.js
Python Inicio rápido: Biblioteca cliente de Azure Cosmos DB for NoSQL para Python

Importante

En los ejemplos de código siguientes se supone que ya tiene las variables client y container. Si necesita crear esas variables, consulte el inicio rápido adecuado para la plataforma.

Ejecución de procedimientos almacenados

Los procedimientos almacenados se escriben con JavaScript. Pueden crear, actualizar, leer, consultar y eliminar elementos dentro de un contenedor de Azure Cosmos DB. Para obtener más información, vea Cómo escribir procedimientos almacenados.

Los ejemplos siguientes muestran cómo registrar y llamar a un procedimiento almacenado mediante los SDK de Azure Cosmos DB. Para el origen de este procedimiento almacenado, guardado como spCreateToDoItem.js, consulte Creación de elementos mediante procedimientos almacenados.

Nota:

Para los contenedores con particiones, al ejecutar un procedimiento almacenado, debe proporcionar un valor de clave de partición en las opciones de solicitud. Los procedimientos almacenados siempre se limitan a una clave de partición. Los elementos que tienen un valor de clave de partición diferente no están visibles para el procedimiento almacenado. Este principio se aplica también a los desencadenadores.

El siguiente ejemplo muestra cómo registrar un procedimiento almacenado con el SDK de .NET 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;

El siguiente código muestra cómo llamar a un procedimiento almacenado con el SDK de .NET 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 });

Ejecución de desencadenadores previos

Los ejemplos siguientes muestran cómo registrar y llamar a un desencadenador previo mediante los SDK de Azure Cosmos DB. Para obtener el origen de este ejemplo de desencadenador previo, guardado como trgPreValidateToDoItemTimestamp.js, consulte Desencadenadores previos.

Cuando ejecuta una operación al especificar PreTriggerInclude y pasar el nombre del desencadenador en un objeto List, los desencadenadores previos se pasan en el objeto RequestOptions.

Nota:

Aunque el nombre del desencadenador se pasa como List, puede ejecutar solo un desencadenador por cada operación.

El código siguiente muestra cómo registrar un desencadenador previo mediante el SDK de. NET 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);

El código siguiente muestra cómo llamar a un desencadenador previo mediante el SDK de. NET 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);

Ejecución de desencadenadores posteriores

Los ejemplos siguientes muestran cómo registrar un desencadenador posterior mediante los SDK de Azure Cosmos DB. Para obtener el origen de este ejemplo de desencadenador posterior, guardado como trgPostUpdateMetadata.js, consulte Desencadenadores posteriores

El código siguiente muestra cómo registrar un desencadenador posterior mediante el SDK de .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);

El código siguiente muestra cómo llamar a un desencadenador posterior mediante el SDK de .NET 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);

Trabajo con funciones definidas por el usuario

Los ejemplos siguientes muestran cómo registrar una función definida por el usuario mediante los SDK de Azure Cosmos DB. Para obtener el origen de este ejemplo de función definida por el usuario, guardado como udfTax.js, vea Cómo escribir funciones definidas por el usuario.

El código siguiente muestra cómo registrar una función definida por el usuario mediante el SDK de .NET 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);

El código siguiente muestra cómo llamar a una función definida por el usuario mediante el SDK de .NET 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
}

Pasos siguientes

Aprenda más conceptos y cómo escribir o utilizar procedimientos almacenados, desencadenadores y funciones definidas por el usuario en Azure Cosmos DB: