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
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]
Sintaks DSL
- Klausa Kondisional
DMS menggunakan klausa kondisional untuk mengevaluasi apakah suatu tindakan perlu dilakukan. Hasil evaluasi klausa ini adalah
trueataufalse. Klausa kondisional terdiri dari penghubung, operator, dan faktor. Penghubung yang digunakan adalahANDdanOR. 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
ANDdanOR. PenghubungANDmemiliki prioritas lebih tinggi dibandingkanOR, namun keduanya memiliki prioritas lebih rendah daripada operator.Sebagai contoh, jika klausa kondisional adalah
1 <= 0 or 1 == 1, DMS akan mengevaluasi hasil dari ekspresi1 <= 0terlebih dahulu, kemudian hasil dari ekspresi1 == 1. Selanjutnya, DMS mengevaluasi hasil dari ekspresiORberdasarkan hasil sebelumnya. - Operator
Operator digunakan untuk menghubungkan faktor dan konstanta dalam operasi logika. Tabel berikut menjelaskan operator yang didukung oleh DMS.
Operator Deskripsi Contoh == 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 in Mengevaluasi apakah suatu nilai termasuk dalam larik nilai. 'a' in ['a', 'b', 'c'] not in Mengevaluasi apakah suatu nilai tidak termasuk dalam larik nilai. 'a' not in ['a', 'b', 'c'] matchs Mengevaluasi apakah string cocok dengan ekspresi reguler. 'idx_aa' matchs 'idx_\\w+' not matchs Mengevaluasi apakah string tidak cocok dengan ekspresi reguler. 'idx_aa' not matchs 'idx_\\w+' isBlank Mengevaluasi apakah suatu nilai kosong. '' isBlank isNotBlank Mengevaluasi 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 adalah1 <= 2 == true, Anda dapat menulis ulang menjadi(1 <= 2) == trueuntuk menentukan prioritas. DMS akan mengevaluasi hasil dari ekspresi1 <= 2dalam 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.Faktor Deskripsi @fac.env_type Jenis lingkungan. Nilainya adalah nama tampilan jenis lingkungan, seperti DEVatauPRODUCT. Untuk informasi lebih lanjut, lihat Ubah jenis lingkungan untuk instance.@fac.sql_type Jenis pernyataan SQL. Nilainya adalah subkategori pernyataan SQL, seperti UPDATEatauINSERT.@fac.detail_type Jenis 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_logic Menunjukkan apakah database yang akan terpengaruh adalah database logis. @fac.extra_info Informasi lain tentang tiket. Faktor ini tidak digunakan. @fac.is_ignore_affect_rows Menunjukkan apakah akan melewati validasi. @fac.insert_rows Jumlah baris data ke mana Anda ingin memasukkan data. @fac.update_delete_rows Jumlah baris data yang akan diperbarui. @fac.max_alter_table_size Ukuran ruang tabel terbesar tempat tabel yang akan dimodifikasi disimpan. @fac.is_has_security_column Menunjukkan apakah pernyataan SQL yang akan dieksekusi melibatkan bidang sensitif. @fac.security_column_list Bidang sensitif yang terlibat dalam pernyataan SQL yang akan dieksekusi. @fac.risk_level Tingkat risiko operasi yang akan dilakukan oleh pernyataan SQL. @fac.risk_reason Alasan 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.
- Penghubung
- Klausa Tindakan
Tindakan dalam aturan keamanan adalah operasi yang dilakukan DMS ketika kondisi
IFterpenuhi. 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.Tindakan Deskripsi @act.allow_submit Meminta pengiriman pernyataan SQL yang akan dieksekusi dalam tiket. @act.allow_execute_direct Mengizinkan eksekusi pernyataan SQL di SQL Console. @act.forbid_execute Melarang eksekusi pernyataan SQL. @act.mark_risk Menandai operasi dengan tingkat risiko. Contoh: @act.mark_risk 'middle' 'Risiko sedang: lingkungan online'.@act.do_not_approve Menentukan 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.
Fungsi Deskripsi Contoh @fun.concat Menggabungkan 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_length Mengembalikan 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_lower Mengevaluasi 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_upper Mengevaluasi 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_size Menghitung 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.add Menjumlahkan beberapa nilai numerik. Output: sebuah nilai numerik.
Input: beberapa nilai numerik.@fun.add(1, 2, 3) // Outputnya adalah 6. @fun.sub Mengurangi nilai numerik dari nilai numerik lain. Output: sebuah nilai numerik.
Input: dua nilai numerik.@fun.sub(6, 1) // 5 @fun.between Mengevaluasi 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_datetime Mengembalikan 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_date Mengembalikan 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_time Mengembalikan 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_str Mengevaluasi 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.listEqualIgnoreOrder Mengevaluasi 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 endCatatan Jika pernyataan SQL dalam tiket adalah jenisUPDATE,DELETE,INSERT, atauINSERT_SELECT, DMS mengizinkan eksekusi pernyataan tersebut.