Data Management (DMS), veritabanı geliştirme iş akışları için güvenlik kurallarını tanımlamanıza olanak tanıyan bir alana özgü dil (DSL) sunar. DSL kurallarını kullanarak hangi SQL deyimlerinin gönderilebileceğini, onayların nasıl yönlendirileceğini ve işlemlerin ne zaman engelleneceğini veya riskli olarak işaretleneceğini kontrol edebilirsiniz.
Nasıl çalışır?
Bir güvenlik kuralı, IF-THEN (EĞER-İSE) veya IF-THEN-ELSE (EĞER-İSE-YOKSA) yapısında bir ifadedir. Bir koşul karşılandığında DMS ilgili eylemi yürütür.
Temel yapı:
if <condition>
then <action>
end
Birden çok dallanma içeren genişletilmiş yapı:
if <condition 1>
then <action 1>
elseif <condition 2>
then <action 2>
[else <action 3>]
end
Her kural tam olarak bir if koşulu içermelidir. Sıfır veya daha fazla elseif dalı ve sıfır veya bir else yan tümcesi bulunabilir. Hiçbir dal eşleşmezse ve bir else yan tümcesi yoksa DMS herhangi bir eylem gerçekleştirmez.
DSL bileşenleri
Bir güvenlik kuralı üç temel yapı taşından oluşur: koşullu ifadeler, eylem ifadeleri ve önceden tanımlanmış işlevler.
Koşullu ifadeler
Koşullu ifade, true veya false değerini döndürür. Aşağıdakilerden biri veya birkaçından oluşturulur:
Faktörler — değerlendirme anındaki bağlamı temsil eden önceden tanımlanmış sistem değişkenleri (örneğin, SQL deyimi türü, etkilenen satır sayısı)
Operatörler — değerleri karşılaştıran veya test eden semboller
Bağlayıcılar — birden çok ifadeyi birleştiren
ANDveOR
AND operatörünün önceliği OR operatöründen daha yüksektir. Her ikisinin önceliği de diğer operatörlerden daha düşüktür. Varsayılan değerlendirme sırasını geçersiz kılmak için parantez kullanın.
Örnek: 1 <= 0 or 1 == 1 ifadesinde DMS önce 1 <= 0 ve 1 == 1 ifadelerini ayrı ayrı değerlendirir, ardından OR uygulamasını gerçekleştirir. Önceliği açık hale getirmek için: (1 <= 0) == true.
Operatörler
Operatörler, koşullu ifadelerde faktörleri ve sabitleri birbirine bağlar. Aşağıdaki operatörler desteklenir:
| Operatör | Açıklama | Örnek |
|---|---|---|
== |
Eşittir | 1 == 1 |
!= |
Eşit değildir | 1 != 2 |
> |
Büyüktür | @fac.insert_rows > 1000 |
>= |
Büyük veya eşittir | @fac.insert_rows >= 1000 |
< |
Küçüktür | @fac.insert_rows < 100 |
<= |
Küçük veya eşittir | @fac.insert_rows <= 100 |
in |
Bir diziye aittir | 'a' in ['a', 'b', 'c'] |
not in |
Bir diziye ait değildir | 'a' not in ['a', 'b', 'c'] |
matchs |
Düzenli ifadeyle eşleşir | 'idx_aa' matchs 'idx_\\w+' |
not matchs |
Düzenli ifadeyle eşleşmez | 'idx_aa' not matchs 'idx_\\w+' |
isBlank |
Değer boştur | '' isBlank |
isNotBlank |
Değer boş değildir | '' isNotBlank |
Düzenli ifadelerde ters eğik çizgi kaçış karakteri: Regex deseninde gerçek bir ters eğik çizgi (\) kullanmak için bunu başka bir ters eğik çizgi ile kaçış karakteri olarak belirtin. Örneğin, idx_\w+ ile eşleşmek için idx_\\w+ yazın.
Faktörler
Faktörler, güvenlik kuralı değerlendirme zamanında bağlam sağlayan önceden tanımlanmış değişkenlerdir; örneğin SQL deyimi türü, etkilenen satır sayısı veya hedefin mantıksal bir veritabanı olup olmadığı. Gerçek işlem meta verilerine dayalı kurallar yazmak için bunları koşullu ifadelerde kullanın.
Bir faktör adı @fac.<display-name> biçimini kullanır. DMS, her modüldeki farklı kontrol noktaları için farklı faktörler sağlar.
| Faktör | Açıklama |
|---|---|
@fac.env_type |
Ortam türü. Örnek değerler: DEV, PRODUCT. Bkz. Change the environment type for an instance. |
@fac.sql_type |
SQL deyimi türü. Örnek değerler: UPDATE, INSERT. |
@fac.detail_type |
Veri değiştirme bileti türü. Geçerli değerler aşağıda verilmiştir. |
@fac.is_logic |
Hedef veritabanının mantıksal bir veritabanı olup olmadığı. |
@fac.extra_info |
Diğer bilet bilgileri. Şu anda kullanılmamaktadır. |
@fac.is_ignore_affect_rows |
Satır sayısı doğrulamasının atlanıp atlanmayacağı. |
@fac.insert_rows |
Eklenecek satır sayısı. |
@fac.update_delete_rows |
Güncellenecek veya silinecek satır sayısı. |
@fac.max_alter_table_size |
Değiştirilecek tabloyu içeren en büyük tablo alanının boyutu. |
@fac.is_has_security_column |
SQL deyiminin hassas alanları içerip içermediği. |
@fac.security_column_list |
SQL deyimine dahil edilen hassas alanlar. |
@fac.risk_level |
İşlemin risk düzeyi. |
@fac.risk_reason |
Atanan risk düzeyinin nedeni. |
@fac.ref_schema_names |
Bilette seçilen veritabanı adlarının listesi. |
@fac.detail_type için geçerli değerler:
| Değer | Bilet türü |
|---|---|
COMMON |
Normal Veri Değiştirme |
CHUNK_DML |
Kilitsiz Değişiklik |
PROCEDURE |
Programlanabilir Nesne |
CRON_CLEAR_DATA |
Geçmiş Veri Temizleme |
BIG_FILE |
Büyük Veri İçe Aktarma |
Örnek: Bir SQL deyiminin DML deyimi olup olmadığını kontrol etme:
@fac.sql_type == 'DML'
Eylem ifadeleri
Bir eylem, bir koşul karşılandığında DMS'nin ne yapacağını tanımlar. Eylem adları @act.<display-name> biçimini kullanır. DMS, her modüldeki farklı kontrol noktaları için farklı eylemler sağlar.
| Eylem | Açıklama |
|---|---|
@act.allow_submit |
SQL deyimlerinin bir bilette yürütülmek üzere gönderilmesini gerektirir. |
@act.allow_execute_direct |
SQL deyimlerinin SQL Console'da yürütülmesine izin verir. |
@act.forbid_execute |
SQL deyimlerinin yürütülmesini engeller. |
@act.mark_risk |
İşlemi bir risk düzeyi ve özel bir mesajla işaretler. Örnek: @act.mark_risk 'middle' 'Medium risk: online environment' |
@act.do_not_approve |
Bir onay şablonunun ID'sini belirtir. Bkz. Configure approval processes. |
@act.choose_approve_template |
|
@act.choose_approve_template_with_reason |
Önceden tanımlanmış işlevler
Önceden tanımlanmış işlevler hem koşullu ifadelerde hem de eylem ifadelerinde kullanılabilir. İşlev adları @fun.<display-name> biçimini kullanır.
| İşlev | Giriş | Çıkış | Açıklama |
|---|---|---|---|
@fun.concat |
Birden çok dize | Dize | Dizeleri tek bir dizede birleştirir. |
@fun.char_length |
Bir dize | Tamsayı | Bir dizinin uzunluğunu döndürür. |
@fun.is_char_lower |
Bir dize | Boolean | Tüm harfler küçük harf ise true döndürür. |
@fun.is_char_upper |
Bir dize | Boolean | Tüm harfler büyük harf ise true döndürür. |
@fun.array_size |
Bir dizi | Tamsayı | Bir dizideki öğe sayısını döndürür. |
@fun.add |
Birden çok sayısal değer | Sayısal | Birden çok değeri toplar. |
@fun.sub |
İki sayısal değer | Sayısal | İlk değerden ikinci değeri çıkarır. |
@fun.between |
Üç değer: hedef, alt sınır, üst sınır | Boolean | Hedef [alt, üst] kapalı aralığına düşüyorsa true döndürür. NUMERIC, DATE ve TIME türlerini destekler. |
@fun.current_datetime |
Yok | Dize | Geçerli tarih ve saati yyyy-MM-dd HH:mm:ss biçiminde döndürür. |
@fun.current_date |
Yok | Dize | Geçerli tarihi yyyy-MM-dd biçiminde döndürür. |
@fun.current_time |
Yok | Dize | Geçerli saati HH:mm:ss biçiminde döndürür. |
@fun.is_contain_str |
İki dize | Boolean | İlk dize ikinciyi içeriyorsa true döndürür. |
@fun.listEqualIgnoreOrder |
İki dize listesi | Boolean | Her iki liste de sıra veya büyük/küçük harf fark etmeksizin aynı dizeleri içeriyorsa true döndürür. |
Seçilmiş örnekler:
Dize birleştirme:
@fun.concat('d', 'm', 's')
// Output: 'dms'
@fun.concat('[Development standards] Enter a comment for the [', @fac.column_name, '] field.')
// Output: a reminder message with the field name inserted
Sayısal bir değerin bir aralıkta olup olmadığını kontrol etme:
@fun.between(@fac.export_rows, 2001, 100000)
// Returns true if the number of exported rows is between 2,001 and 100,000
@fun.between(@fun.current_datetime(), '2019-10-31 00:00:00', '2019-11-04 00:00:00')
// Returns true if the current date and time fall within the specified window
Liste eşitliğini kontrol etme:
@fun.listEqualIgnoreOrder(@fac.perm_type, ['QUERY'])
// Returns true if only the query permission is requested
@fun.listEqualIgnoreOrder(@fac.perm_type, ['CORRECT', 'EXPORT'])
// Returns true if both the change and export permissions are requested
Örnekler
Bilet başına SQL deyimi sayısını sınırlama
Bir bilet 1.000'den fazla SQL deyimi içeriyorsa gönderimi engelleyin:
if
@fac.sql_count > 1000
then
@act.reject_execute 'The number of SQL statements in a ticket cannot exceed 1,000.'
end
Sayı 1.000'i aşarsa DMS bileti reddeder ve mesajı görüntüler.
Yalnızca DML deyimlerine izin verme
Yalnızca tüm SQL deyimleri DML işlemleri olduğunda gönderime izin verin:
if
@fac.sql_type in ['UPDATE', 'DELETE', 'INSERT', 'INSERT_SELECT']
then
@act.allow_submit
end