All Products
Search
Document Center

Data Management:Sintaksis DSL untuk aturan keamanan

Last Updated:Jul 29, 2026

Data Management (DMS) menyediakan bahasa domain-spesifik (DSL) untuk menentukan aturan keamanan dalam alur kerja pengembangan database. Aturan DSL digunakan untuk mengontrol pernyataan SQL yang dapat diajukan, cara perutean persetujuan, serta kapan operasi diblokir atau ditandai sebagai berisiko.

Cara kerja

Aturan keamanan berupa pernyataan IF-THEN atau IF-THEN-ELSE. Ketika suatu kondisi terpenuhi, DMS menjalankan aksi yang sesuai.

Struktur dasar:

if <kondisi>
then <aksi>
end

Struktur diperluas dengan beberapa cabang:

if <kondisi 1>
then <aksi 1>
elseif <kondisi 2>
then <aksi 2>
[else <aksi 3>]
end

Setiap aturan harus berisi tepat satu klausa if. Aturan tersebut dapat memiliki nol atau lebih cabang elseif dan nol atau satu klausa else. Jika tidak ada cabang yang cocok dan tidak terdapat klausa else, DMS tidak menjalankan aksi apa pun.

Komponen DSL

Aturan keamanan terdiri dari tiga blok penyusun: klausa kondisional, klausa aksi, dan fungsi yang telah ditentukan sebelumnya.

Klausa kondisional

Klausa kondisional dievaluasi menjadi true atau false. Klausa ini dibangun dari satu atau beberapa elemen berikut:

  • Factors — variabel sistem yang telah ditentukan sebelumnya dan merepresentasikan konteks pada saat evaluasi (misalnya, jenis pernyataan SQL, jumlah baris yang terpengaruh)

  • Operators — simbol yang membandingkan atau menguji nilai

  • ConnectorsAND dan OR, yang menggabungkan beberapa ekspresi

AND memiliki prioritas lebih tinggi daripada OR. Keduanya memiliki prioritas lebih rendah daripada operator. Gunakan tanda kurung untuk mengubah urutan evaluasi bawaan.

Contoh: Pada 1 <= 0 or 1 == 1, DMS mengevaluasi 1 <= 0 dan 1 == 1 secara terpisah, lalu menerapkan OR. Untuk membuat prioritas eksplisit: (1 <= 0) == true.

Operator

Operator menghubungkan factors dan konstanta dalam ekspresi kondisional. Operator berikut didukung:

Operator Deskripsi Contoh
== Sama dengan 1 == 1
!= Tidak sama dengan 1 != 2
> Lebih besar dari @fac.insert_rows > 1000
>= Lebih besar dari atau sama dengan @fac.insert_rows >= 1000
< Lebih kecil dari @fac.insert_rows < 100
<= Lebih kecil dari atau sama dengan @fac.insert_rows <= 100
in Termasuk dalam array 'a' in ['a', 'b', 'c']
not in Tidak termasuk dalam array 'a' not in ['a', 'b', 'c']
matchs Sesuai dengan ekspresi reguler 'idx_aa' matchs 'idx_\\w+'
not matchs Tidak sesuai dengan ekspresi reguler 'idx_aa' not matchs 'idx_\\w+'
isBlank Nilai kosong '' isBlank
isNotBlank Nilai tidak kosong '' isNotBlank

Pelarian backslash dalam ekspresi reguler: Untuk menyertakan backslash literal (\) dalam pola regex, tambahkan backslash lain sebagai pelarian. Misalnya, tulis idx_\\w+ untuk mencocokkan idx_\w+.

Factors

Factors adalah variabel yang telah ditentukan sebelumnya dan menyediakan konteks pada saat evaluasi aturan keamanan—seperti jenis pernyataan SQL, jumlah baris yang terpengaruh, atau apakah target merupakan database logis. Gunakan factors dalam klausa kondisional untuk menulis aturan berdasarkan metadata operasi aktual.

Nama factor menggunakan format @fac.<display-name>. DMS menyediakan factors berbeda untuk berbagai checkpoint di setiap modul.

Factor Deskripsi
@fac.env_type Jenis lingkungan. Contoh nilai: DEV, PRODUCT. Lihat Ubah jenis lingkungan untuk instans.
@fac.sql_type Jenis pernyataan SQL. Contoh nilai: UPDATE, INSERT.
@fac.detail_type Jenis tiket perubahan data. Lihat nilai valid di bawah ini.
@fac.is_logic Apakah database target merupakan database logis.
@fac.extra_info Informasi tiket lainnya. Saat ini tidak digunakan.
@fac.is_ignore_affect_rows Apakah validasi jumlah baris dilewati.
@fac.insert_rows Jumlah baris yang akan dimasukkan.
@fac.update_delete_rows Jumlah baris yang akan diperbarui atau dihapus.
@fac.max_alter_table_size Ukuran ruang tabel terbesar yang berisi tabel yang akan dimodifikasi.
@fac.is_has_security_column Apakah pernyataan SQL melibatkan bidang sensitif.
@fac.security_column_list Bidang sensitif yang terlibat dalam pernyataan SQL.
@fac.risk_level Tingkat risiko operasi.
@fac.risk_reason Alasan penetapan tingkat risiko.
@fac.ref_schema_names Daftar nama database yang dipilih dalam tiket.

Nilai valid untuk `@fac.detail_type`:

Nilai Jenis tiket
COMMON Normal Data Modify
CHUNK_DML Lockless Change
PROCEDURE Programmable Object
CRON_CLEAR_DATA History Data Clean
BIG_FILE Large Data Import

Contoh: Periksa apakah pernyataan SQL merupakan pernyataan DML:

@fac.sql_type == 'DML'

Klausa aksi

Aksi mendefinisikan respons DMS ketika suatu kondisi terpenuhi. Nama aksi menggunakan format @act.<display-name>. DMS menyediakan aksi berbeda untuk berbagai checkpoint di setiap modul.

Tindakan Deskripsi
@act.allow_submit Mengharuskan pengajuan pernyataan SQL untuk dieksekusi dalam tiket.
@act.allow_execute_direct Mengizinkan eksekusi pernyataan SQL di SQL Console.
@act.forbid_execute Memblokir eksekusi pernyataan SQL.
@act.mark_risk Menandai operasi dengan tingkat risiko dan pesan kustom. Contoh: @act.mark_risk 'middle' 'Medium risk: online environment'
@act.do_not_approve Menentukan ID templat persetujuan. Lihat Konfigurasikan proses persetujuan.
@act.choose_approve_template
@act.choose_approve_template_with_reason

Fungsi yang telah ditentukan sebelumnya

Fungsi yang telah ditentukan sebelumnya dapat digunakan baik dalam klausa kondisional maupun klausa aksi. Nama fungsi menggunakan format @fun.<display-name>.

Fungsi Input Output Deskripsi
@fun.concat Beberapa string String Menggabungkan beberapa string menjadi satu.
@fun.char_length Sebuah string Integer Mengembalikan panjang string.
@fun.is_char_lower Sebuah string Boolean Mengembalikan true jika semua huruf berupa huruf kecil.
@fun.is_char_upper Sebuah string Boolean Mengembalikan true jika semua huruf berupa huruf kapital.
@fun.array_size Sebuah array Integer Mengembalikan jumlah elemen dalam array.
@fun.add Beberapa nilai numerik Numerik Menjumlahkan beberapa nilai.
@fun.sub Dua nilai numerik Numerik Mengurangkan nilai kedua dari nilai pertama.
@fun.between Tiga nilai: target, batas bawah, batas atas Boolean Mengembalikan true jika target berada dalam rentang tertutup [batas bawah, batas atas]. Mendukung tipe NUMERIC, DATE, dan TIME.
@fun.current_datetime Tidak ada String Mengembalikan tanggal dan waktu saat ini dalam format yyyy-MM-dd HH:mm:ss.
@fun.current_date Tidak ada String Mengembalikan tanggal saat ini dalam format yyyy-MM-dd.
@fun.current_time Tidak ada String Mengembalikan waktu saat ini dalam format HH:mm:ss.
@fun.is_contain_str Dua string Boolean Mengembalikan true jika string pertama berisi string kedua.
@fun.listEqualIgnoreOrder Dua daftar string Boolean Mengembalikan true jika kedua daftar berisi string yang sama, tanpa memperhatikan urutan atau kapitalisasi.

Beberapa contoh terpilih:

Penggabungan string:

@fun.concat('d', 'm', 's')
// Output: 'dms'
@fun.concat('[Development standards] Enter a comment for the [', @fac.column_name, '] field.')
// Output: pesan pengingat dengan nama bidang disisipkan

Memeriksa apakah nilai numerik berada dalam rentang tertentu:

@fun.between(@fac.export_rows, 2001, 100000)
// Mengembalikan true jika jumlah baris yang diekspor berada di antara 2.001 dan 100.000
@fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00')
// Mengembalikan true jika tanggal dan waktu saat ini berada dalam jendela yang ditentukan

Memeriksa kesamaan daftar:

@fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY'])
// Mengembalikan true jika hanya izin kueri yang diminta
@fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT', 'EXPORT'])
// Mengembalikan true jika izin perubahan dan ekspor keduanya diminta

Contoh

Batasi jumlah pernyataan SQL per tiket

Blokir pengajuan jika tiket berisi lebih dari 1.000 pernyataan SQL:

if
    @fac.sql_count > 1000
then
    @act.reject_execute 'Jumlah pernyataan SQL dalam satu tiket tidak boleh melebihi 1.000.'
end

Jika jumlah melebihi 1.000, DMS menolak tiket dan menampilkan pesan tersebut.

Izinkan hanya pernyataan DML

Izinkan pengajuan hanya jika semua pernyataan SQL merupakan operasi DML:

if
    @fac.sql_type in ['UPDATE', 'DELETE', 'INSERT', 'INSERT_SELECT']
then
    @act.allow_submit
end