Compartir a través de


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

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 definir uno o varios procedimientos almacenados, desencadenadores o UDF, puede cargarlos y verlos en Azure Portal mediante Data Explorer.

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

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

Importante

En los siguientes ejemplos de código 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 mediante 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.

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

Nota:

En el caso de 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 son visibles para el procedimiento almacenado. Este principio también se aplica a los desencadenadores.

En el ejemplo siguiente se muestra cómo registrar un procedimiento almacenado mediante 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;

En el código siguiente se muestra cómo llamar a un procedimiento almacenado mediante 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 });

Cómo ejecutar desencadenadores previos

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

Al ejecutar una operación especificando PreTriggerInclude y pasando el nombre del desencadenador en un List objeto , los desencadenadores previos se pasan en el RequestOptions objeto .

Nota:

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

En el código siguiente se 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);

En el código siguiente se 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

En los ejemplos siguientes se muestra cómo registrar un desencadenador posterior mediante los SDK de Azure Cosmos DB. Para obtener el origen de este ejemplo posterior al desencadenador, guardado como trgPostUpdateMetadata.js, consulte Post-triggers (Desencadenadores posteriores).

En el código siguiente se 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);

En el código siguiente se 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);

Cómo trabajar con funciones definidas por el usuario

En los ejemplos siguientes se muestra cómo registrar una UDF mediante los SDK de Azure Cosmos DB. Para obtener el origen de este ejemplo, guardado como udfTax.js, vea Cómo escribir funciones definidas por el usuario.

En el código siguiente se 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);

En el código siguiente se 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