Procedury składowane

Usługa Azure Cosmos DB to globalnie rozproszona wielomodelowa baza danych, która obsługuje modele danych dokumentów, grafów i klucz-wartość. Zawartość tej sekcji służy do tworzenia, wykonywania zapytań i zarządzania zasobami dokumentów przy użyciu interfejsu API SQL za pośrednictwem interfejsu API REST.

Procedura składowana jest fragmentem logiki aplikacji napisanej w języku JavaScript, która jest zarejestrowana i wykonywana względem kolekcji jako pojedynczej transakcji. W usłudze Azure Cosmos DB język JavaScript jest hostowany w tej samej przestrzeni pamięci co baza danych. W związku z tym żądania wykonywane w ramach procedur składowanych są wykonywane w tym samym zakresie sesji bazy danych. Ten proces umożliwia usłudze Azure Cosmos DB zagwarantowanie ACID dla wszystkich operacji, które są częścią jednej procedury składowanej.

Zasób procedury składowanej jest reprezentowany przez sprocs w modelu zasobów usługi Azure Cosmos DB.

Zasób procedury składowanej ma stały schemat. Właściwość body zawiera logikę aplikacji. Poniższy przykład ilustruje konstrukcję JSON procedury składowanej.

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

Tylko tryb dostępu Wszystkie dla określonej procedury składowanej nie zezwala użytkownikowi na wykonanie procedury składowanej. Zamiast tego użytkownik musi mieć tryb dostępu Wszystkie na poziomie kolekcji, aby wykonać procedurę składowaną.

Właściwość Opis
id Wymagane. Jest to właściwość ustawiana przez użytkownika. Jest to unikatowa nazwa używana do identyfikowania procedury składowanej. Identyfikator nie może przekraczać 255 znaków.
Ciała Wymagane. Jest to właściwość ustawiana przez użytkownika. Jest to treść procedury składowanej.
_Rid Jest to właściwość wygenerowana przez system. Identyfikator zasobu (_rid) to unikatowy identyfikator, który jest również hierarchiczny dla stosu zasobów w modelu zasobów. Jest on używany wewnętrznie do umieszczania i nawigacji zasobu procedury składowanej.
_Ts Jest to właściwość wygenerowana przez system. Określa ostatni zaktualizowany znacznik czasu zasobu. Wartość jest znacznikiem czasu.
_Własny Jest to właściwość wygenerowana przez system. Jest to unikatowy adresowy identyfikator URI zasobu.
_Etag Jest to właściwość wygenerowana przez system, która określa tag zasobu wymagany do optymistycznej kontroli współbieżności.

Procedury składowane mogą używać zestawu SDK po stronie serwera usługi Cosmos DB, aby wykonywać operacje bazy danych, takie jak tworzenie, odczytywanie, aktualizowanie, usuwanie i wykonywanie zapytań dotyczących dokumentów, a także odczytywanie z treści żądania i zapisywanie w treści odpowiedzi procedury składowanej. Aby uzyskać więcej informacji, zobacz samouczek dotyczący programowania po stronie serwera usługi Cosmos DB.

Oto na przykład procedura składowana dla "Hello world":

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

Poniższy przykład tworzy dokument wewnątrz procedury składowanej:

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

Poniższy przykład zamienia dwa elementy wewnątrz procedury składowanej:

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

Zadania

Możesz wykonać następujące operacje przy użyciu procedur składowanych:

Aby uzyskać informacje na temat działania procedur składowanych, w tym wykonywania procedury składowanej, zobacz Programowanie w usłudze Azure Cosmos DB: procedury składowane, wyzwalacze i funkcje zdefiniowane przez użytkownika.

Zobacz też