Procedimientos almacenados

Azure Cosmos DB es una base de datos multimodelo distribuida globalmente que admite los modelos de datos de documento, gráfico y clave-valor. El contenido de esta sección es para crear, consultar y administrar recursos de documentos mediante la API de SQL a través de REST.

Un procedimiento almacenado es un trozo de lógica de aplicación escrito en JavaScript que se registra y ejecuta contra una colección como una sola transacción. En Azure Cosmos DB, JavaScript se hospeda en el mismo espacio de memoria que la base de datos. De ahí que las solicitudes realizadas dentro procedimientos almacenados se ejecuten en el mismo ámbito de una sesión de base de datos. Este proceso permite a Azure Cosmos DB garantizar ACID para todas las operaciones que forman parte de un único procedimiento almacenado.

El recurso de procedimiento almacenado se representa mediante sprocs en el modelo de recursos de Azure Cosmos DB.

El recurso de procedimiento almacenado tiene un esquema fijo. La propiedad del cuerpo contiene la lógica de aplicación. En el ejemplo siguiente se muestra la construcción JSON de un procedimiento almacenado.

{    
   "id":"SimpleStoredProc",  
   "body":"function (docToCreate, addedPropertyName, addedPropertyValue {getContext().getResponse().setBody('Hello World');}",  
   "_rid":"hLEEAI1YjgcBAAAAAAAAgA==",  
   "_ts":1408058682,  
   "_self":"dbs\/hLEEAA==\/colls\/hLEEAI1Yjgc=\/sprocs\/hLEEAI1YjgcBAAAAAAAAgA==\/",  
   "_etag":"00004100-0000-0000-0000-53ed453a0000"  
}  
  

Simplemente tener todo el modo de acceso para un procedimiento almacenado determinado no permite al usuario ejecutar el procedimiento almacenado. En su lugar, el usuario debe tener todo el modo de acceso en el nivel de colección para ejecutar un procedimiento almacenado.

Propiedad Descripción
id Necesario. Es una propiedad que se puede establecer por el usuario. Es el nombre único usado para identificar el procedimiento almacenado. El id no debe superar los 255 caracteres.
body Necesario. Es una propiedad que se puede establecer por el usuario. Es el cuerpo del procedimiento almacenado.
_Librar Es una propiedad generada por el sistema. El identificador de recurso (_rid) es un identificador único que también es jerárquico por la pila de recursos en el modelo de recursos. Se usa internamente para la colocación y el desplazamiento del recurso de procedimiento almacenado.
_Ts Es una propiedad generada por el sistema. Especifica la última marca de tiempo actualizada del recurso. El valor es una marca de tiempo.
_propio Es una propiedad generada por el sistema. Es el URI direccionable único para el recurso.
_Etag Es una propiedad generada por el sistema que especifica la etag de recursos necesaria para el control de simultaneidad optimista.

Los procedimientos almacenados pueden usar el SDK del servidor javaScript de Cosmos DB para realizar operaciones de base de datos como crear, leer, actualizar, eliminar y consultar documentos, así como leer desde el cuerpo de la solicitud y escribir en el cuerpo de la respuesta del procedimiento almacenado. Para más información, consulte el tutorial de programación del lado servidor de Cosmos DB.

Por ejemplo, este es un procedimiento almacenado para “Hello World”:

var helloWorldStoredProc = {  
    id: "helloWorld",  
    body: function () {  
        var context = getContext();  
        var response = context.getResponse();  
  
        response.setBody("Hello, World");  
    }  
}  
  

En el siguiente ejemplo se crea un documento dentro del procedimiento almacenado:

{  
    id: "createMyDocument",  
    body: function createMyDocument(documentToCreate) {  
        var context = getContext();  
        var collection = context.getCollection();  
  
        var accepted = collection.createDocument(collection.getSelfLink(),  
              documentToCreate,  
            function (err, documentCreated) {  
                if (err) throw new Error('Error' + err.message);  
                context.getResponse().setBody(documentCreated.id)  
            });  
        if (!accepted) return;  
    }  
}  
  

En el siguiente ejemplo se intercambian dos elementos dentro de un procedimiento almacenado:

// JavaScript source code  
var exchangeItemsSproc = {  
    name: "exchangeItems",  
    body: function (playerId1, playerId2) {  
        var context = getContext();  
        var collection = context.getCollection();  
        var response = context.getResponse();  
  
        var player1Document, player2Document;  
  
        // query for players  
        var filterQuery = 'SELECT * FROM Players p where p.id  = "' + playerId1 + '"';  
        var accept = collection.queryDocuments(collection.getSelfLink(), filterQuery, {},  
            function (err, documents, responseOptions) {  
                if (err) throw new Error("Error" + err.message);  
  
                if (documents.length != 1) throw "Unable to find both names";  
                player1Document = documents[0];  
  
                var filterQuery2 = 'SELECT * FROM Players p where p.id = "' + playerId2 + '"';  
                var accept2 = collection.queryDocuments(collection.getSelfLink(), filterQuery2, {},  
                    function (err2, documents2, responseOptions2) {  
                        if (err2) throw new Error("Error" + err2.message);  
                        if (documents2.length != 1) throw "Unable to find both names";  
                        player2Document = documents2[0];  
                        swapItems(player1Document, player2Document);  
                        return;  
                    });  
                if (!accept2) throw "Unable to read player details, abort ";  
            });  
  
        if (!accept) throw "Unable to read player details, abort ";  
  
        // swap the two players’ items  
        function swapItems(player1, player2) {  
            var player1ItemSave = player1.item;  
            player1.item = player2.item;  
            player2.item = player1ItemSave;  
  
            var accept = collection.replaceDocument(player1._self, player1,  
                function (err, docReplaced) {  
                    if (err) throw "Unable to update player 1, abort ";  
  
                    var accept2 = collection.replaceDocument(player2._self, player2,  
                        function (err2, docReplaced2) {  
                            if (err) throw "Unable to update player 2, abort"  
                        });  
  
                    if (!accept2) throw "Unable to update player 2, abort";  
                });  
  
            if (!accept) throw "Unable to update player 1, abort";  
        }  
    }  
}  
  

Tareas

Puede realizar las siguientes operaciones con procedimientos almacenados:

Para obtener información sobre cómo funcionan los procedimientos almacenados, incluida la ejecución de un procedimiento almacenado, consulte Programación de Azure Cosmos DB: Procedimientos almacenados, desencadenadores y UDF.

Consulte también