저장 프로시저

Azure Cosmos DB 는 문서, 그래프 및 키-값 데이터 모델을 지원하는 전역적으로 분산된 다중 모델 데이터베이스입니다. 이 섹션의 내용은 REST를 통해 SQL API 를 사용하여 문서 리소스를 만들고, 쿼리하고, 관리하기 위한 것입니다.

저장 프로시저는 JavaScript로 작성된 응용 프로그램 논리 조각으로서, 단일 트랜잭션으로 컬렉션에 대해 등록되고 실행됩니다. Azure Cosmos DB에서 JavaScript는 데이터베이스와 동일한 메모리 공간에서 호스트됩니다. 따라서 저장 프로시저 내에서 실행되는 요청은 동일한 데이터베이스 세션 범위에서 실행됩니다. 이 프로세스를 통해 Azure Cosmos DB는 단일 저장 프로시저의 일부인 모든 작업에 대해 ACID를 보장할 수 있습니다.

저장 프로시저 리소스는 Azure Cosmos DB 리소스 모델의 sprocs로 표시됩니다.

저장 프로시저 리소스에는 고정 스키마가 있습니다. Body 속성에는 응용 프로그램 논리가 포함됩니다. 다음 예제에서는 저장 프로시저의 JSON 구문을 보여 줍니다.

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

특정 저장 프로시저에 대한 모든 액세스 모드 만 있으면 사용자가 저장 프로시저를 실행할 수 없습니다. 대신 저장 프로시저를 실행하려면 컬렉션 수준에서 모든 액세스 모드 가 있어야 합니다.

속성 Description
id 필수 요소. 사용자 설정 가능 속성입니다. 저장 프로시저를 식별하는 데 사용하는 고유 이름입니다. id는 255자 이내여야 합니다.
body 필수 요소. 사용자 설정 가능 속성입니다. 저장 프로시저의 본문입니다.
_rid 시스템 생성 속성입니다. 리소스 ID(_rid)는 리소스 모델의 리소스 스택당 계층적인 고유 식별자입니다. 저장 프로시저 리소스의 배치와 탐색용으로 내부에서 사용됩니다.
_ts 시스템 생성 속성입니다. 리소스가 마지막으로 업데이트된 시간의 타임스탬프를 지정합니다. 값은 타임스탬프입니다.
_self 시스템 생성 속성입니다. 고유한 주소를 지정할 수 있는 리소스의 URI입니다.
_etag 낙관적 동시성 제어에 필요한 리소스 etag를 지정하는 시스템 생성 속성입니다.

저장 프로시저는 Cosmos DB JavaScript 서버 쪽 SDK를 사용하여 문서 만들기, 읽기, 업데이트, 삭제 및 쿼리와 같은 데이터베이스 작업을 수행하고 요청 본문에서 읽고 저장 프로시저의 응답 본문에 쓸 수 있습니다. 자세한 내용은 Cosmos DB 서버 쪽 프로그래밍 자습서를 참조하세요.

예를 들어 다음은 “Hello World”에 대한 저장 프로시저입니다.

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

다음 예제에서는 저장 프로시저 내에 문서를 만듭니다.

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

다음 예제에서는 저장 프로시저 내의 두 항목을 교환합니다.

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

작업

저장 프로시저를 사용하여 다음 작업을 수행할 수 있습니다.

저장 프로시저 실행을 포함하여 저장 프로시저의 작동 방식에 대한 자세한 내용은 Azure Cosmos DB 프로그래밍: 저장 프로시저, 트리거 및 UDF를 참조하세요.

참고 항목