Buat pemicu dan fungsi yang ditentukan pengguna

Selesai

Azure Cosmos DB mendukung pretrigger dan pasca-pemicu. Praperadilan dijalankan sebelum memodifikasi item database dan pasca-pemicu dijalankan setelah memodifikasi item database. Pemicu tidak dijalankan secara otomatis, pemicu harus ditentukan untuk setiap operasi database tempat Anda ingin menjalankannya. Setelah Anda menentukan pemicu, Anda harus mendaftarkannya dengan menggunakan SDK Azure Cosmos DB.

Untuk contoh cara mendaftar dan memanggil pemicu, lihat pretrigger dan pasca-pemicu.

Pretrigger

Contoh berikut menunjukkan bagaimana pretrigger digunakan untuk memvalidasi properti item Azure Cosmos yang sedang dibuat, ia menambahkan properti tanda waktu ke item yang baru ditambahkan jika tidak berisinya.

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

Pretrigger tidak dapat memiliki parameter input apa pun. Objek permintaan di pemicu digunakan untuk memanipulasi pesan permintaan yang terkait dengan operasi. Dalam contoh sebelumnya, pretrigger dijalankan saat membuat item Azure Cosmos, dan isi pesan permintaan berisi item yang akan dibuat dalam format JSON.

Saat pemicu terdaftar, pengguna dapat menentukan operasi yang dijalankannya. Pemicu ini harus dibuat dengan TriggerOperation nilai TriggerOperation.Create, yang berarti menggunakan pemicu dalam operasi penggantian tidak diizinkan.

Untuk contoh cara mendaftar dan memanggil pretrigger, kunjungi artikel pretrigger .

Pascapemicu

Contoh berikut menunjukkan pasca-pemicu. Ini memicu kueri untuk item metadata dan memperbaruinya dengan detail tentang item yang baru dibuat.

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

Satu hal yang penting untuk diperhatikan adalah eksekusi transaksional pemicu di Azure Cosmos DB. Pasca-pemicu berjalan sebagai bagian dari transaksi yang sama untuk item yang mendasarinya. Pengecualian selama eksekusi pasca-pemicu gagal seluruh transaksi. Apa pun yang diterapkan digulung balik dan pengecualian dikembalikan.

Fungsi yang ditentukan pengguna

Contoh berikut membuat UDF untuk menghitung pajak penghasilan berbagai tingkat pendapatan. Fungsi yang ditentukan pengguna ini kemudian akan digunakan di dalam kueri. Untuk tujuan contoh ini, asumsikan ada kontainer yang disebut "Pendapatan" dengan properti sebagai berikut:

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

Berikut ini adalah definisi fungsi untuk menghitung pajak penghasilan dari berbagai tingkat pendapatan:

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