全部产品
Search
文档中心

Data Management:Sintaks DSL untuk aturan keamanan

更新时间:Jun 28, 2025

Data Management (DMS) menyediakan bahasa domain-spesifik (DSL) untuk mendefinisikan aturan keamanan. Anda dapat menggunakan sintaks DSL untuk menentukan aturan yang berfungsi sebagai standar pengembangan database sesuai dengan kebutuhan bisnis Anda.

Ikhtisar

Sintaks DSL untuk aturan keamanan terdiri dari pernyataan IF-THEN atau IF-THEN-ELSE, mencakup satu atau lebih kondisi dan tindakan. Format dasar aturan keamanan adalah sebagai berikut:

 
    Kondisi 1
 
    Tindakan 1
 
Catatan Jika Kondisi 1 terpenuhi, DMS menjalankan Tindakan 1.

Aturan keamanan dapat mencakup beberapa kondisi. Setelah menentukan kondisi IF, Anda dapat menggunakan ELSEIF untuk menambahkan kondisi tambahan. Aturan harus mencakup setidaknya satu kondisi IF, nol atau lebih kondisi ELSEIF, serta nol atau satu klausa ELSE.

 
    Kondisi 1
 
    Tindakan 1
 
    Kondisi 2
 
    Tindakan 2
[else Tindakan 3]
 
Catatan Jika Kondisi 1 terpenuhi, DMS menjalankan Tindakan 1. Jika Kondisi 1 tidak terpenuhi tetapi Kondisi 2 terpenuhi, DMS menjalankan Tindakan 2. Jika baik Kondisi 1 maupun Kondisi 2 tidak terpenuhi, DMS menjalankan Tindakan 3. Namun, jika klausa `ELSE Tindakan 3` dihilangkan dan kedua kondisi tersebut tidak terpenuhi, DMS tidak akan melakukan tindakan apa pun.

Sintaks DSL

  • Klausa Kondisional

    DMS menggunakan klausa kondisional untuk mengevaluasi apakah suatu tindakan perlu dilakukan. Hasil evaluasi klausa ini adalah true atau false. Klausa kondisional terdiri dari penghubung, operator, dan faktor. Penghubung yang digunakan adalah AND dan OR. Faktor merupakan variabel sistem yang telah ditentukan sebelumnya. Berikut adalah contoh klausa kondisional yang valid:

    true                    // Ini adalah klausa kondisional paling sederhana. Hasilnya adalah true. 
     
     
     
    Catatan Hasil evaluasi dari contoh klausa kondisional ini adalah benar.
    • Penghubung

      Penghubung yang tersedia adalah AND dan OR. Penghubung AND memiliki prioritas lebih tinggi dibandingkan OR, namun keduanya memiliki prioritas lebih rendah daripada operator.

      Sebagai contoh, jika klausa kondisional adalah 1 <= 0 or 1 == 1, DMS akan mengevaluasi hasil dari ekspresi 1 <= 0 terlebih dahulu, kemudian hasil dari ekspresi 1 == 1. Selanjutnya, DMS mengevaluasi hasil dari ekspresi OR berdasarkan hasil sebelumnya.

    • Operator

      Operator digunakan untuk menghubungkan faktor dan konstanta dalam operasi logika. Tabel berikut menjelaskan operator yang didukung oleh DMS.

      OperatorDeskripsiContoh
      ==Mengevaluasi apakah suatu nilai sama dengan nilai lain.1 == 1
      !=Mengevaluasi apakah suatu nilai tidak sama dengan nilai lain.1 != 2
      >Mengevaluasi apakah suatu nilai lebih besar dari nilai lain.1 > 2
      >=Mengevaluasi apakah suatu nilai lebih besar dari atau sama dengan nilai lain.1 >= 2
      <Mengevaluasi apakah suatu nilai lebih kecil dari nilai lain.1 < 2
      <=Mengevaluasi apakah suatu nilai lebih kecil dari atau sama dengan nilai lain.1 <= 2
      inMengevaluasi apakah suatu nilai termasuk dalam larik nilai.'a' in ['a', 'b', 'c']
      not inMengevaluasi apakah suatu nilai tidak termasuk dalam larik nilai.'a' not in ['a', 'b', 'c']
      matchsMengevaluasi apakah string cocok dengan ekspresi reguler.'idx_aa' matchs 'idx_\\w+'
      not matchsMengevaluasi apakah string tidak cocok dengan ekspresi reguler.'idx_aa' not matchs 'idx_\\w+'
      isBlankMengevaluasi apakah suatu nilai kosong.'' isBlank
      isNotBlankMengevaluasi apakah suatu nilai tidak kosong.'' isNotBlank

      Jika Anda perlu menggunakan backslash (\) dalam ekspresi reguler, tambahkan karakter escape berupa backslash lain (\) sebelumnya. Sebagai contoh, untuk menulis ekspresi idx_\w+, gunakan idx_\\w+.

      Catatan Operator memiliki prioritas default. Namun, Anda dapat menentukan prioritas ekspresi sesuai kebutuhan. Jika klausa kondisional mencakup ekspresi bersarang, disarankan untuk mengapit ekspresi dengan prioritas lebih tinggi menggunakan tanda kurung (). Contohnya, jika klausa kondisional adalah 1 <= 2 == true, Anda dapat menulis ulang menjadi (1 <= 2) == true untuk menentukan prioritas. DMS akan mengevaluasi hasil dari ekspresi 1 <= 2 dalam tanda kurung terlebih dahulu.
    • Faktor

      Faktor adalah variabel yang telah ditentukan sebelumnya dalam DMS. Anda dapat menggunakan faktor untuk mendapatkan konteks yang akan divalidasi oleh aturan keamanan. Konteks meliputi kategori pernyataan SQL dan jumlah baris yang terpengaruh. Nama faktor dimulai dengan awalan @fac. diikuti dengan nama tampilan faktor. DMS menyediakan faktor berbeda untuk titik pemeriksaan yang berbeda di setiap modul. Tabel berikut mencantumkan beberapa faktor beserta deskripsinya.

      FaktorDeskripsi
      @fac.env_typeJenis lingkungan. Nilainya adalah nama tampilan jenis lingkungan, seperti DEV atau PRODUCT. Untuk informasi lebih lanjut, lihat Ubah jenis lingkungan untuk instance.
      @fac.sql_typeJenis pernyataan SQL. Nilainya adalah subkategori pernyataan SQL, seperti UPDATE atau INSERT.
      @fac.detail_typeJenis perubahan data. Nilai yang valid:
      • COMMON: Tiket Modifikasi Data Normal
      • CHUNK_DML: Tiket Perubahan Tanpa Kunci
      • PROCEDURE: Tiket Objek Pemrograman
      • CRON_CLEAR_DATA: Tiket Pembersihan Data Historis
      • BIG_FILE: Tiket Impor Data Besar
      @fac.is_logicMenunjukkan apakah database yang akan terpengaruh adalah database logis.
      @fac.extra_infoInformasi lain tentang tiket. Faktor ini tidak digunakan.
      @fac.is_ignore_affect_rowsMenunjukkan apakah akan melewati validasi.
      @fac.insert_rowsJumlah baris data ke mana Anda ingin memasukkan data.
      @fac.update_delete_rowsJumlah baris data yang akan diperbarui.
      @fac.max_alter_table_sizeUkuran ruang tabel terbesar tempat tabel yang akan dimodifikasi disimpan.
      @fac.is_has_security_columnMenunjukkan apakah pernyataan SQL yang akan dieksekusi melibatkan bidang sensitif.
      @fac.security_column_listBidang sensitif yang terlibat dalam pernyataan SQL yang akan dieksekusi.
      @fac.risk_levelTingkat risiko operasi yang akan dilakukan oleh pernyataan SQL.
      @fac.risk_reasonAlasan mengapa operasi ditandai dengan tingkat risiko ini.

      Anda dapat menggunakan faktor dalam klausa kondisional. Contohnya, tuliskan @fac.sql_type == 'DML' untuk mengevaluasi apakah pernyataan SQL termasuk dalam jenis DML.

  • Klausa Tindakan

    Tindakan dalam aturan keamanan adalah operasi yang dilakukan DMS ketika kondisi IF terpenuhi. Contohnya, DMS dapat memblokir pengiriman tiket, memilih proses persetujuan, menyetujui tiket, atau menolak tiket. Tindakan ini mencerminkan tujuan dari aturan keamanan. Nama tindakan dimulai dengan awalan @act. diikuti dengan nama tampilan tindakan. DMS menyediakan tindakan berbeda untuk titik pemeriksaan yang berbeda di setiap modul. Tabel berikut mencantumkan beberapa tindakan beserta deskripsinya.

    TindakanDeskripsi
    @act.allow_submitMeminta pengiriman pernyataan SQL yang akan dieksekusi dalam tiket.
    @act.allow_execute_directMengizinkan eksekusi pernyataan SQL di SQL Console.
    @act.forbid_executeMelarang eksekusi pernyataan SQL.
    @act.mark_riskMenandai operasi dengan tingkat risiko. Contoh: @act.mark_risk 'middle' 'Risiko sedang: lingkungan online'.
    @act.do_not_approveMenentukan ID template persetujuan. Untuk informasi lebih lanjut, lihat Konfigurasi proses persetujuan.
    @act.choose_approve_template
    @act.choose_approve_template_with_reason
  • Fungsi yang Telah Ditentukan Sebelumnya

    DMS menyediakan fungsi yang telah ditentukan sebelumnya yang dapat digunakan dalam klausa kondisional dan tindakan. Nama fungsi dimulai dengan awalan @fun. diikuti dengan nama tampilan fungsi.

    FungsiDeskripsiContoh
    @fun.concatMenggabungkan string menjadi satu string tunggal.

    Output: sebuah string.

    Input: beberapa string.
    @fun.concat('d', 'm', 's') // Outputnya adalah string 'dms'.

    @fun.concat('[Standar pengembangan] Anda harus memasukkan komentar untuk [', @fac.column_name, '] bidang.') // Outputnya adalah pesan yang mengingatkan pengguna untuk memasukkan komentar pada bidang tertentu.

    @fun.char_lengthMengembalikan panjang string.

    Output: sebuah bilangan bulat.

    Input: sebuah string.
    @fun.char_length('dms') // Outputnya adalah 3.

    @fun.char_length(@fac.table_name) // Outputnya adalah panjang nama tabel.

    @fun.is_char_lowerMengevaluasi apakah semua huruf dalam string adalah huruf kecil.

    Output: true atau false.

    Input: sebuah string.
    @fun.is_char_lower('dms') // Outputnya adalah true.

    @fun.is_char_lower(@fac.table_name) // Jika semua huruf dalam nama tabel adalah huruf kecil, outputnya adalah true.

    @fun.is_char_upperMengevaluasi apakah semua huruf dalam string adalah huruf besar.

    Output: true atau false.

    Input: sebuah string.
    @fun.is_char_upper('dms') // Outputnya adalah false.

    @fun.is_char_upper(@fac.table_name) // Jika semua huruf dalam nama tabel adalah huruf besar, outputnya adalah true.

    @fun.array_sizeMenghitung jumlah nilai dalam larik.

    Output: sebuah bilangan bulat.

    Input: larik nilai.
    @fun.array_size([1, 2, 3]) // Outputnya adalah 3.

    @fun.array_size(@fac.table_index_array) // Outputnya adalah jumlah indeks tabel.

    @fun.addMenjumlahkan beberapa nilai numerik.

    Output: sebuah nilai numerik.

    Input: beberapa nilai numerik.
    @fun.add(1, 2, 3) // Outputnya adalah 6.
    @fun.subMengurangi nilai numerik dari nilai numerik lain.

    Output: sebuah nilai numerik.

    Input: dua nilai numerik.
    @fun.sub(6, 1) // 5
    @fun.betweenMengevaluasi apakah suatu nilai berada dalam rentang tertutup tertentu. Tipe data yang didukung adalah NUMERIC, DATE, dan TIME.

    Output: true atau false.

    Input: terdiri dari tiga nilai. Nilai pertama adalah nilai yang dievaluasi, nilai kedua adalah batas bawah, dan nilai ketiga adalah batas atas.
    @fun.between(1, 1, 3) // Outputnya adalah true karena nilai 1 berada dalam [1, 3].

    @fun.between(2, 1, 3) // Outputnya adalah true karena nilai 2 berada dalam [1, 3].

    @fun.between(7, 1, 3) // Outputnya adalah false karena nilai 7 tidak berada dalam [1, 3].

    @fun.between(@fac.export_rows, 2001, 100000) // Jika jumlah baris yang diekspor berada dalam [2001, 100000], outputnya adalah true.

    @fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00') // Jika tanggal dan waktu saat ini berada dalam [2019-10-31 00:00:00, 2019-11-04 00:00:00], outputnya adalah true.

    @fun.between(@fun.current_date(), '2019-10-31', '2019-11-04') // Jika tanggal saat ini berada dalam [2019-10-31, 2019-11-04], outputnya adalah true.

    @fun.current_datetimeMengembalikan tanggal dan waktu saat ini dalam format yyyy-MM-dd HH:mm:ss.

    Output: sebuah string.

    Input: tidak ada.
    @fun.current_datetime() // Outputnya adalah tanggal dan waktu saat ini, misalnya, 2019-10-31 00:00:00.
    @fun.current_dateMengembalikan tanggal saat ini dalam format yyyy-MM-dd.

    Output: sebuah string.

    Input: tidak ada.
    @fun.current_date() // Outputnya adalah tanggal saat ini, misalnya, 2020-01-13.
    @fun.current_timeMengembalikan waktu saat ini dalam format HH:mm:ss.

    Output: sebuah string.

    Input: tidak ada.
    @fun.current_time() // Outputnya adalah waktu saat ini, misalnya, 19:43:20.
    @fun.is_contain_strMengevaluasi apakah string pertama mengandung string kedua.

    Output: true atau false.

    Input: dua string.
    @fun.is_contain_str('abcd', 'ab') // Outputnya adalah true karena string pertama abcd mengandung string kedua ab.
    @fun.listEqualIgnoreOrderMengevaluasi apakah dua daftar string berisi string yang sama, tanpa memperhatikan urutan dan sensitivitas huruf dari string dalam daftar.

    Output: true atau false.

    Input: dua daftar string.
    @fun.listEqualIgnoreOrder(['ab','cd'], ['Cd','ab']) // Outputnya adalah true karena kedua daftar string berisi string yang sama.

    @fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY']) // Jika hanya izin kueri yang diminta, outputnya adalah true.

    @fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT','EXPORT']) // Jika baik izin perubahan maupun ekspor yang diminta, outputnya adalah true.

Contoh

  • Batasi jumlah pernyataan SQL dalam tiket
     
         
     
        @act.reject_execute 'Jumlah pernyataan SQL dalam tiket tidak boleh melebihi 1.000.'
     
         
     
    Catatan Jika jumlah pernyataan SQL dalam tiket tidak melebihi 1.000, DMS mengeksekusi pernyataan tersebut. Jika tidak, DMS menolak tiket dan menampilkan pesan yang ditentukan.
  • Izinkan pengiriman hanya untuk pernyataan DML
    if
        @fac.sql_type in [ 'UPDATE','DELETE','INSERT','INSERT_SELECT']
    then
        @act.allow_submit
    end
    Catatan Jika pernyataan SQL dalam tiket adalah jenis UPDATE, DELETE, INSERT, atau INSERT_SELECT, DMS mengizinkan eksekusi pernyataan tersebut.