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.

Vedere anche