Stored procedure
Azure Cosmos DB è un database multimodello distribuito a livello globale che supporta i modelli di dati document, graph e key-value. Il contenuto di questa sezione riguarda la creazione, l'esecuzione di query e la gestione delle risorse documento tramite l'API SQL tramite REST.
Una stored procedure è una parte di logica dell'applicazione scritta in JavaScript che viene registrata ed eseguita su una raccolta come una singola transazione. In Azure Cosmos DB JavaScript è ospitato nello stesso spazio di memoria del database. Di conseguenza, le richieste effettuate nell'ambito delle stored procedure vengono eseguite nello stesso ambito di una sessione di database. Questo processo consente ad Azure Cosmos DB di garantire ACID per tutte le operazioni che fanno parte di una singola stored procedure.
La risorsa stored procedure è rappresentata da sprocs nel modello di risorse di Azure Cosmos DB.
La risorsa stored procedure ha uno schema fisso. La proprietà body contiene la logica dell'applicazione. L'esempio seguente illustra il costrutto JSON di una stored procedure.
{
"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"
}
La sola modalità di accesso per una determinata stored procedure non consente all'utente di eseguire la stored procedure. L'utente deve invece avere la modalità Di accesso a tutti a livello di raccolta per eseguire una stored procedure.
Proprietà | Descrizione |
---|---|
id | Obbligatorio. Si tratta di una proprietà impostabile dall'utente. Si tratta del nome univoco usato per identificare la stored procedure. L'ID non deve superare i 255 caratteri. |
body | Obbligatorio. Si tratta di una proprietà impostabile dall'utente. È il corpo della stored procedure. |
_rid | Si tratta di una proprietà generata dal sistema. L'ID risorsa (_rid) è un identificatore univoco gerarchico anche per ogni stack di risorse nel modello di risorse. Viene usato internamente per il posizionamento e l'esplorazione della risorsa stored procedure. |
_Ts | Si tratta di una proprietà generata dal sistema. Indica il timestamp dell'ultimo aggiornamento della risorsa. Il valore è un timestamp. |
_stesso | Si tratta di una proprietà generata dal sistema. URI indirizzabile univoco per la risorsa. |
_Etag | Si tratta di una proprietà generata dal sistema che specifica l'etag della risorsa necessaria per il controllo della concorrenza ottimistica. |
Le stored procedure possono usare l'SDK lato server JavaScript di Cosmos DB per eseguire operazioni di database come creare, leggere, aggiornare, eliminare ed eseguire query sui documenti, nonché leggere dal corpo della richiesta e scrivere nel corpo della risposta della stored procedure. Per altre informazioni, vedere l'esercitazione sulla programmazione lato server di Cosmos DB.
Ad esempio, ecco una stored procedure per "Hello World":
var helloWorldStoredProc = {
id: "helloWorld",
body: function () {
var context = getContext();
var response = context.getResponse();
response.setBody("Hello, World");
}
}
L'esempio seguente crea un documento all'interno della stored procedure:
{
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;
}
}
L'esempio seguente scambia due elementi all'interno della stored procedure:
// 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";
}
}
}
Attività
È possibile eseguire le operazioni seguenti con le stored procedure:
Per informazioni sul funzionamento delle stored procedure, inclusa l'esecuzione di una stored procedure, vedere Programmazione di Azure Cosmos DB: stored procedure, trigger e funzioni definite dall'utente.