Gespeicherte Prozeduren

Azure Cosmos DB ist eine global verteilte Datenbank mit mehreren Modellen, die dokument-, graph- und schlüsselwertbasierte Datenmodelle unterstützt. Der Inhalt in diesem Abschnitt ist für das 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 Arbeitsspeicher wie die Datenbank gehostet. Daher werden die in gespeicherten Prozeduren ausgeführten Anforderungen in demselben Gültigkeitsbereich einer Datenbanksitzung ausgeführt. Dieser Prozess ermöglicht Azure Cosmos DB, ACID für alle Vorgänge zu garantieren, die Teil einer einzelnen gespeicherten Prozedur sind.

Die Ressource der gespeicherten Prozedur wird durch sprocs im Azure Cosmos DB-Ressourcenmodell 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"  
}  
  

Wenn der Zugriffsmodus Alle für eine bestimmte gespeicherte Prozedur lediglich festgelegt ist, kann der Benutzer die gespeicherte Prozedur nicht ausführen. Stattdessen muss der Benutzer den Modus Alle Zugriff auf Sammlungsebene haben, um eine gespeicherte Prozedur ausführen zu können.

Eigenschaft BESCHREIBUNG
id Erforderlich. Es handelt sich um eine vom Benutzer festlegbare 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 festlegbare Eigenschaft. Dies ist der Text der gespeicherten Prozedur.
_rid 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.
_self 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 COSMOS DB JavaScript SDK verwenden, um Datenbankvorgänge wie das Erstellen, Lesen, Aktualisieren, Löschen und Abfragen von Dokumenten sowie das Lesen aus dem Anforderungskörper und das Schreiben in den Antwortkörper der gespeicherten Prozedur durchzuführen. Weitere Informationen finden Sie im Tutorial Cosmos datenbankseitige Programmierung.

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 tun:

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