Procedimentos Armazenados
O Azure Cosmos DB é uma base de dados com vários modelos distribuída globalmente que suporta os modelos de dados de documentos, gráficos e chave-valor. O conteúdo desta secção destina-se a criar, consultar e gerir recursos de documentos com a API SQL através do REST.
Um procedimento armazenado é uma parte da lógica da aplicação escrita em JavaScript que é registada e executada numa coleção como uma única transação. No Azure Cosmos DB, o JavaScript está alojado no mesmo espaço de memória que a base de dados. Assim, os pedidos efetuados nos procedimentos armazenados são executados no mesmo âmbito de uma sessão de base de dados. Este processo permite ao Azure Cosmos DB garantir 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 recursos do Azure Cosmos DB.
O recurso de procedimento armazenado tem um esquema fixo. A propriedade body contém a lógica da aplicação. O exemplo seguinte 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 o Modo de acesso Todos para um determinado procedimento armazenado não permite que o utilizador execute o procedimento armazenado. Em vez disso, o utilizador tem de ter o Modo de acesso Todos ao nível da coleção para executar um procedimento armazenado.
Propriedade | Descrição |
---|---|
id | Obrigatório. É uma propriedade settable do utilizador. É o nome exclusivo utilizado para identificar o procedimento armazenado. O ID não pode exceder os 255 carateres. |
corpo | Obrigatório. É uma propriedade settable do utilizador. É o corpo do procedimento armazenado. |
_rid | É uma propriedade gerada pelo sistema. O ID do recurso (_rid) é um identificador exclusivo que também é hierárquico de acordo com a pilha de recursos no modelo de recursos. É utilizado internamente para colocação e navegação do recurso de procedimento armazenado. |
_ts | É uma propriedade gerada pelo sistema. Especifica o último carimbo de data/hora atualizado do recurso. O valor é um carimbo de data/hora. |
_self | É uma propriedade gerada pelo sistema. É o URI endereçável exclusivo para o recurso. |
_etag | É uma propriedade gerada pelo sistema que especifica a etag de recursos necessária para o controlo de simultaneidade otimista. |
Os procedimentos armazenados podem utilizar o SDK do Lado do Servidor JavaScript do Cosmos DB para fazer operações de base de dados como criar, ler, atualizar, eliminar e consultar documentos, bem como ler a partir do corpo do pedido e escrever no corpo da resposta do procedimento armazenado. Para obter mais informações, veja o tutorial de programação do lado do servidor do Cosmos DB.
Por exemplo, eis 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 seguinte 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 seguinte troca 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
Pode efetuar as seguintes operações com procedimentos armazenados:
Para obter informações sobre como funcionam os procedimentos armazenados, incluindo a execução de um procedimento armazenado, veja Programação do Azure Cosmos DB: Procedimentos armazenados, acionadores e UDFs.