Share via


Tárolt eljárások

Az Azure Cosmos DB egy globálisan elosztott többmodelles adatbázis, amely támogatja a dokumentum-, gráf- és kulcs-érték adatmodelleket. Ebben a szakaszban a dokumentum-erőforrások REST-en keresztüli létrehozására, lekérdezésére és kezelésére van lehetőség az SQL API használatával.

A tárolt eljárás egy JavaScriptben írt alkalmazáslogika, amelyet a rendszer egyetlen tranzakcióként regisztrál és hajt végre egy gyűjteményen. Az Azure Cosmos DB-ben a JavaScript az adatbázissal megegyező memóriaterületen található. Ezért a tárolt eljárásokban végrehajtott kérések az adatbázis-munkamenet azonos hatókörében futnak. Ez a folyamat lehetővé teszi, hogy az Azure Cosmos DB garantálja az ACID-t minden olyan művelet esetében, amely egyetlen tárolt eljárás része.

A tárolt eljárás erőforrását sprocsok képviselik az Azure Cosmos DB-erőforrásmodellben.

A tárolt eljárás erőforrása rögzített sémával rendelkezik. A body tulajdonság tartalmazza az alkalmazás logikáját. Az alábbi példa egy tárolt eljárás JSON-szerkezetét szemlélteti.

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

Egy adott tárolt eljárás minden hozzáférési módjának használata nem teszi lehetővé, hogy a felhasználó végrehajtsa a tárolt eljárást. Ehelyett a felhasználónak minden hozzáférési móddal rendelkeznie kell a gyűjtemény szintjén egy tárolt eljárás végrehajtásához.

Tulajdonság Leírás
id Kötelező. Ez egy felhasználó által beállított tábla tulajdonság. Ez a tárolt eljárás azonosítására használt egyedi név. Az azonosító nem haladhatja meg a 255 karaktert.
Szervezet Kötelező. Ez egy felhasználó által beállított tábla tulajdonság. Ez a tárolt eljárás törzse.
_Megszabadulni Ez egy rendszer által létrehozott tulajdonság. Az erőforrás-azonosító (_rid) egy egyedi azonosító, amely szintén hierarchikus az erőforrásmodell erőforrás-vermében. Belsőleg használják a tárolt eljárás erőforrásának elhelyezésére és navigációjára.
_Ts Ez egy rendszer által létrehozott tulajdonság. Meghatározza az erőforrás utolsó frissített időbélyegét. Az érték egy időbélyeg.
_Önálló Ez egy rendszer által létrehozott tulajdonság. Ez az erőforrás egyedi címezhető URI-ja.
_Etag Ez egy rendszer által létrehozott tulajdonság, amely meghatározza az optimista egyidejűség-vezérléshez szükséges erőforrás-etaget.

A tárolt eljárások a Cosmos DB JavaScript kiszolgálóoldali SDK-val olyan adatbázis-műveleteket hajthatnak végre, mint a dokumentumok létrehozása, olvasása, frissítése, törlése és lekérdezése, valamint a kérelemtörzsből való olvasás és a tárolt eljárás választörzsébe való írás. További információt a Cosmos DB kiszolgálóoldali programozási oktatóanyagában talál.

Íme például a ""Helló világ!" alkalmazás" tárolt eljárása:

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

Az alábbi példa egy dokumentumot hoz létre a tárolt eljárásban:

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

Az alábbi példa két elemet cserél fel egy tárolt eljárásban:

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

Feladatok

A tárolt eljárásokkal a következő műveleteket végezheti el:

A tárolt eljárások működésével kapcsolatos információkért, beleértve a tárolt eljárások végrehajtását, tekintse meg az Azure Cosmos DB programozása: Tárolt eljárások, eseményindítók és UDF-ek című témakört.

Lásd még: