Procedimentos armazenados

O Azure Cosmos DB é um banco de dados multimodelo distribuído globalmente que dá suporte aos modelos de dados de documento, grafo e chave-valor. O conteúdo nesta seção destina-se à criação, consulta e gerenciamento de recursos de documento usando a API do SQL por meio do REST.

Um procedimento armazenado é uma parte da lógica de aplicativo escrita em JavaScript que é registrada e executada em uma coleção como uma única transação. No Azure Cosmos DB, o JavaScript é hospedado no mesmo espaço de memória que o banco de dados. Portanto, solicitações feitas em procedimentos armazenados são executadas no mesmo escopo de uma sessão de banco de dados. Esse processo permite que o Azure Cosmos DB garanta ACID para todas as operações que fazem parte de um único procedimento armazenado.

O recurso de procedimento armazenado é representado por sprocs no modelo de recurso do Azure Cosmos DB.

O recurso de procedimento armazenado possui um esquema fixo. A propriedade Corpo contém a lógica do aplicativo. O exemplo a seguir ilustra a construção JSON de um procedimento armazenado.

{    
   "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"  
}  
  

Apenas ter Todo o modo de acesso para um procedimento armazenado específico não permite que o usuário execute o procedimento armazenado. Em vez disso, o usuário precisa ter Todos os modos de acesso no nível da coleção para executar um procedimento armazenado.

Propriedade Descrição
id Obrigatórios. É uma propriedade configurável pelo usuário. É o nome exclusivo usado para identificar o procedimento armazenado. A ID não deve exceder 255 caracteres.
body Obrigatórios. É uma propriedade configurável pelo usuário. É o corpo do procedimento armazenado.
_Livrar É uma propriedade gerada pelo sistema. A ID do recurso (_rid) é um identificador exclusivo que também é hierárquico de acordo com a pilha de recursos no modelo de recurso. Ela é usada internamente para posicionamento e navegação do recurso de procedimento.
_Ts É uma propriedade gerada pelo sistema. Especifica o último carimbo de data/hora atualizado do recurso. O valor é um carimbo de data/hora.
_Auto É uma propriedade gerada pelo sistema. É o URI endereçável exclusivo do recurso.
_Etag É uma propriedade gerada pelo sistema que especifica a etag de recurso necessária para o controle de simultaneidade otimista.

Os procedimentos armazenados podem usar o SDK do servidor JavaScript do Cosmos DB para fazer operações de banco de dados como criar, ler, atualizar, excluir e consultar documentos, bem como ler do corpo da solicitação e gravar no corpo da resposta do procedimento armazenado. Para obter mais informações, consulte o tutorial de programação do lado do servidor do Cosmos DB.

Por exemplo, aqui está um procedimento armazenado para "Hello World":

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

O exemplo a seguir cria um documento dentro do procedimento armazenado:

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

O exemplo a seguir alterna entre dois itens dentro de um procedimento armazenado:

// 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";  
        }  
    }  
}  
  

Tarefas

Você pode fazer as seguintes operações com procedimentos armazenados:

Para obter informações sobre como os procedimentos armazenados funcionam, incluindo a execução de um procedimento armazenado, consulte Programação do Azure Cosmos DB: procedimentos armazenados, gatilhos e UDFs.

Consulte Também