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