Gespeicherte Prozeduren

Azure Cosmos DB ist eine global verteilte Datenbank mit mehreren Modellen, die die Dokument-, Graph- und Schlüssel-Wert-Datenmodelle unterstützt. Der Inhalt in diesem Abschnitt dient zum Erstellen, Abfragen und Verwalten von Dokumentressourcen mithilfe der SQL-API über REST.

Eine gespeicherte Prozedur ist eine in JavaScript geschriebene Anwendungslogikkomponente, die für eine Auflistung als einzelne Transaktion registriert ist und ausgeführt wird. In Azure Cosmos DB wird JavaScript im gleichen Speicherplatz wie die Datenbank gehostet. Daher werden die in gespeicherten Prozeduren ausgeführten Anforderungen in demselben Gültigkeitsbereich einer Datenbanksitzung ausgeführt. Mit diesem Prozess kann Azure Cosmos DB ACID für alle Vorgänge garantieren, die Teil einer einzelnen gespeicherten Prozedur sind.

Die Ressource der gespeicherten Prozedur wird im Azure Cosmos DB-Ressourcenmodell durch Sprocs dargestellt.

Die Ressource vom Typ "gespeicherte Prozedur" weist ein festes Schema auf. Die Texteigenschaft enthält die Anwendungslogik. Das folgende Beispiel veranschaulicht das JSON-Konstrukt einer gespeicherten Prozedur.

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

Nur der Modus "Alle Zugriff" für eine bestimmte gespeicherte Prozedur ermöglicht es dem Benutzer nicht, die gespeicherte Prozedur auszuführen. Stattdessen muss der Benutzer auf Sammlungsebene über den Modus "Alle Zugriff" verfügen, um eine gespeicherte Prozedur ausführen zu können.

Eigenschaft BESCHREIBUNG
id Erforderlich. Es handelt sich um eine vom Benutzer festgelegte Eigenschaft. Es handelt sich um den eindeutigen Namen, um die gespeicherte Prozedur zu identifizieren. Die id darf nicht länger als 255 Zeichen sein.
body Erforderlich. Es handelt sich um eine vom Benutzer festgelegte Eigenschaft. Es ist der Text der gespeicherten Prozedur.
_los Es handelt sich um eine vom System generierte Eigenschaft. Die Ressourcen-ID (_rid) ist ein eindeutiger Bezeichner, der auch für den Ressourcenstapel im Ressourcenmodell hierarchisch ist. Sie wird intern für die Platzierung und Navigation der Ressource vom Typ "gespeicherte Prozedur" verwendet.
_Ts Es handelt sich um eine vom System generierte Eigenschaft. Sie gibt den zuletzt aktualisierten Zeitstempel der Ressource an. Der Wert ist ein Zeitstempel.
_Selbst Es handelt sich um eine vom System generierte Eigenschaft. Es handelt sich um den eindeutigen, adressierbaren URI für die Ressource.
_Etag Es handelt sich um eine vom System generierte Eigenschaft, die das Ressourcen-Etag angibt, das für die Steuerung der optimistischen Parallelität erforderlich ist.

Gespeicherte Prozeduren können das serverseitige JavaScript-SDK von Cosmos DB verwenden, um Datenbankvorgänge wie Erstellen, Lesen, Aktualisieren, Löschen und Abfragen von Dokumenten sowie Lesen aus dem Anforderungstext und Schreiben in den Antworttext der gespeicherten Prozedur durchzuführen. Weitere Informationen finden Sie im Tutorial zur serverseitigen Programmierung von Cosmos DB.

Hier folgt z. B. eine gespeicherte Prozedur für "Hello World":

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

Das folgende Beispiel erstellt ein Dokument innerhalb der gespeicherten Prozedur:

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

Das folgende Beispiel tauscht zwei Elemente innerhalb einer gespeicherten Prozedur aus:

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

Aufgaben

Sie können die folgenden Vorgänge mit gespeicherten Prozeduren ausführen:

Informationen zur Funktionsweise gespeicherter Prozeduren, einschließlich der Ausführung einer gespeicherten Prozedur, finden Sie unter Azure Cosmos DB-Programmierung: Gespeicherte Prozeduren, Trigger und UDFs.

Weitere Informationen