트리거 및 사용자 정의 함수 만들기

완료됨

Azure Cosmos DB에서는 사전 트리거와 사후 트리거를 지원합니다. 사전 트리거는 데이터베이스 항목을 수정하기 전에 실행되고, 사후 트리거는 데이터베이스 항목을 수정한 후에 실행됩니다. 트리거는 자동으로 실행되지 않으며 실행하려는 각 데이터베이스 작업에 대해 지정해야 합니다. 트리거를 정의한 후에는 Azure Cosmos DB SDK를 사용하여 트리거를 등록해야 합니다.

트리거를 등록하고 호출하는 방법에 대한 예제는 사전 트리거사후 트리거를 참조하세요.

사전 트리거

다음 예제는 사전 트리거를 사용하여 생성되는 Azure Cosmos 항목 속성의 유효성을 검사하는 방법을 보여 줍니다. 이 예제에서는 타임스탬프 속성이 포함되지 않은 경우 새로 추가된 항목에 타임스탬프 속성이 추가됩니다.

function validateToDoItemTimestamp() {
    var context = getContext();
    var request = context.getRequest();

    // item to be created in the current operation
    var itemToCreate = request.getBody();

    // validate properties
    if (!("timestamp" in itemToCreate)) {
        var ts = new Date();
        itemToCreate["timestamp"] = ts.getTime();
    }

    // update the item that will be created
    request.setBody(itemToCreate);
}

사전 트리거는 입력 매개 변수를 사용할 수 없습니다. 트리거에서 요청 개체를 사용하여 작업과 연결된 요청 메시지를 조작합니다. 이전 예제에서 사전 트리거는 Azure Cosmos 항목을 만들 때 실행되고 요청 메시지 본문에는 JSON 형식으로 만들 항목이 포함됩니다.

트리거가 등록될 때 트리거 실행에 사용되는 작업을 지정할 수 있습니다. 이 트리거는 TriggerOperation.CreateTriggerOperation 값을 사용하여 생성되었습니다. 즉, 바꾸기 작업에서 트리거를 사용하는 것은 허용되지 않습니다.

사전 트리거를 등록하고 호출하는 방법의 예는 사전 트리거 문서를 참조하세요.

사후 트리거

다음 예제에서는 사후 트리거를 보여줍니다. 이 트리거는 메타데이터 항목을 쿼리하고 새로 만든 항목에 대한 세부 정보로 업데이트합니다.

function updateMetadata() {
var context = getContext();
var container = context.getCollection();
var response = context.getResponse();

// item that was created
var createdItem = response.getBody();

// query for metadata document
var filterQuery = 'SELECT * FROM root r WHERE r.id = "_metadata"';
var accept = container.queryDocuments(container.getSelfLink(), filterQuery,
    updateMetadataCallback);
if(!accept) throw "Unable to update metadata, abort";

function updateMetadataCallback(err, items, responseOptions) {
    if(err) throw new Error("Error" + err.message);
        if(items.length != 1) throw 'Unable to find metadata document';

        var metadataItem = items[0];

        // update metadata
        metadataItem.createdItems += 1;
        metadataItem.createdNames += " " + createdItem.id;
        var accept = container.replaceDocument(metadataItem._self,
            metadataItem, function(err, itemReplaced) {
                    if(err) throw "Unable to update metadata, abort";
            });
        if(!accept) throw "Unable to update metadata, abort";
        return;
    }
}

한 가지 중요한 사항은 Azure Cosmos DB에서 트리거의 트랜잭션을 실행하는 것입니다. 사후 트리거는 기본 항목 자체와 같은 트랜잭션의 일부로 실행됩니다. 사후 트리거를 실행하는 동안 예외가 발생하면 전체 트랜잭션이 실패합니다. 커밋된 모든 사항은 롤백되며 예외가 반환됩니다.

사용자 정의 함수

다음 샘플에서는 다양한 소득 계층에서 소득세를 계산하는 UDF를 만듭니다. 이 사용자 정의 함수는 쿼리 내에서 사용됩니다. 이 예제의 목적상 다음과 같은 속성의 “Incomes”라는 컨테이너가 있다고 가정합니다.

{
   "name": "User One",
   "country": "USA",
   "income": 70000
}

다양한 소득 계층에서 소득세를 계산하는 함수 정의는 다음과 같습니다.

function tax(income) {

        if(income == undefined)
            throw 'no input';

        if (income < 1000)
            return income * 0.1;
        else if (income < 10000)
            return income * 0.2;
        else
            return income * 0.4;
    }