データ管理 (DMS) は、セキュリティルールを記述するドメイン固有言語 (DSL) を提供します。 DSL構文を使用して、ビジネス要件に基づいてデータベース開発標準として機能するセキュリティルールを定義できます。
概要
セキュリティルールのDSL構文は、1つ以上の条件とアクションで構成されるIF-THENまたはIF-THEN-ELSEステートメントです。 セキュリティルールの基本的な形式は次のとおりです。
Condition 1
Action 1
条件1が満たされる場合、DMSはアクション1を実行する。
セキュリティルールには複数の条件を含めることができます。 IF条件を指定した後、ELSEIF
を使用してさらに条件を指定できます。 セキュリティルールにはIF
条件を含める必要があり、0個以上のELSEIF
条件と0個または1個のELSE
句を含めることができます。
Condition 1
Action 1
Condition 2
Action 2
[else Action 3]
条件1が満たされる場合、DMSはアクション1を実行する。 条件1が満たされず、条件2が満たされる場合、DMSはアクション2を実行する。 条件1と条件2の両方が満たされない場合、DMSはアクション3を実行する。 「ELSEアクション3」句が省略され、条件1および条件2が満たされない場合、DMSはアクションを実行しません。
DSL 構文
条件付き句
DMSは条件節を使用してアクションを実行するかどうかを評価します。 条件句の結果は
true
またはfalse
です。 条件句は、1つ以上のコネクタ、演算子、および要素で構成されます。 コネクタはAND
とOR
です。 因子は、所定のシステム変数である。 次の例は有効な条件句です。true // This is the simplest conditional clause. The result is true.
説明これらのサンプル条件節の結果はすべてtrueです。
コネクタ
コネクタは
AND
とOR
です。AND
コネクタはOR
コネクタよりも優先度が高い。 両方のコネクタは、オペレータよりも優先度が低い。たとえば、条件句が
1 <= 0または1 == 1
の場合、DMSは1 <= 0
式の結果を評価し、次に1 == 1
式の結果を評価します。 その後、DMSは前述の結果に基づいてOR
式の結果を評価します。演算子
演算子は、要素と定数を接続して論理演算を実行するために使用されます。 次の表に、DMSでサポートされる演算子を示します。
演算子
説明
例
==
値が別の値と等しいかどうかを評価します。
1 == 1
!=
値が別の値と等しくないかどうかを評価します。
1! =2
>
値が別の値より大きいかどうかを評価します。
1 > 2
>=
値が別の値以上かどうかを評価します。
1 >= 2
<
値が別の値より小さいかどうかを評価します。
1 < 2
<=
値が別の値以下であるかどうかを評価します。
1 <= 2
in
値が値の配列に属するかどうかを評価します。
['a' 、'b' 、'c'] の 'a'
ではない
値が値の配列に属していないかどうかを評価します。
'a' not in ['a' 、'b' 、'c']
マッチ
文字列が正規表現と一致するかどうかを評価します。
'idx_aa 'matchs 'idx _\\ w +'
一致しない
文字列が正規表現と一致しないかどうかを評価します。
'idx_aa 'が一致しない 'idx_\\ w +'
isBlank
値が空かどうかを評価します。
''isBlank
isNotBlank
値が空でないかどうかを評価します。
''isNotBlank
正規表現でバックスラッシュ (\) を使用する必要がある場合は、使用するバックスラッシュの前に別のバックスラッシュ (\) をエスケープ文字として追加する必要があります。 たとえば、idx_\w + 式を記述する場合は、
idx _\\ w +
を入力する必要があります。説明演算子にはデフォルトの優先順位があります。 ただし、必要に応じて式の優先順位を指定できます。 条件句にネストされた式が含まれている場合は、その式をより高い優先度で括弧 () で囲むことを推奨します。 たとえば、条件句が
1 <= 2 == true
の場合、句を(1 <= 2) == true
に変更して優先順位を指定できます。 DMSは、最初に、括弧内の1 <= 2
の式の結果を評価する。要因
因子は、DMSにおける所定の変数である。 要因を使用して、セキュリティルールによって検証されるコンテキストを取得できます。 コンテキストには、SQL文のカテゴリと影響を受ける行数が含まれます。 因子名は、プレフィックス
@ facで構成されます。
と要素の表示名を指定します。 DMSは、各モジュールの異なるチェックポイントに異なる要因を提供します。 次の表に、いくつかの要因とその説明を示します。要素
説明
@ fac.env_type
環境のタイプ。 値は、
DEV
やPRODUCT
などの環境タイプの表示名です。 詳細については、「インスタンスの環境タイプの変更」をご参照ください。@ fac.sql_type
SQL 文のタイプです。 値は、
UPDATE
やINSERT
などのSQL文のサブカテゴリです。@ fac.de tail_type
データのタイプが変更されます。 有効な値:
共通: 通常のデータ変更チケット
CHUNK_DML: ロックレス変更チケット
PROCEDURE: プログラム可能なオブジェクトチケット
CRON_CLEAR_DATA: 履歴データのクリーンチケット
BIG_FILE: 大規模データのインポートチケット
@ fac.is_logic
影響を受けるデータベースが論理データベースであるかどうかを示します。
@ fac.extra_info
チケットに関するその他の情報。 この要因は使用されていません。
@ fac.is_ignore_affect_rows
検証をスキップするかどうかを示します。
@ fac.insert_rows
データを挿入するデータ行の数。
@ fac.update_delete_rows
更新するデータ行の数。
@ fac.max_alter_table_size
変更するテーブルが格納されている最大のテーブルスペースのサイズ。
@ fac.is_has_security_column
実行するSQL文に機密フィールドが含まれるかどうかを示します。
@ fac.security_column_list
実行されるSQL文に含まれる機密フィールド。
@ fac.risk_level
SQL文によって実行される操作のリスクレベル。
@ fac.risk_reason
操作がこのリスクレベルでマークされている理由。
条件句で要素を使用できます。 たとえば、
@ fac.sql_type == 'DML'
を記述して、SQL文がDML文であるかどうかを評価できます。
アクション句
セキュリティルールのアクションは、ルールの
IF
条件が満たされたときにDMSが実行する操作です。 例えば、DMSは、チケットの提出を禁止し、承認プロセスを選択し、チケットを承認し、またはチケットを拒否することができる。 セキュリティルールのアクションは、セキュリティルールの目的を示します。 アクション名は、プレフィックス@ actで構成されます。
とアクションの表示名を指定します。 DMSは、各モジュールの異なるチェックポイントに対して異なるアクションを提供します。 次の表に、いくつかのアクションとその説明を示します。Action
説明
@ act.allow_submit
チケットで実行されるSQL文の送信が必要です。
@ act.allow_execute_direct
SQL ConsoleでのSQL文の実行を許可します。
@ act.forbid_execute
SQL文の実行を禁止します。
@ act.mark_risk
リスクレベルで操作をマークします。 例:
@ act.mark_risk 'middle' '中リスク: オンライン環境'
@ act.do_not_approve
承認テンプレートのIDを指定します。 詳細については、「承認プロセスの設定」をご参照ください。
@ act.choose_approve_template
@ act.choose_approve_template_with_reason
定義済み関数
DMSは、条件節とアクション節の両方で使用できる定義済みの関数を提供します。 関数名はプレフィックスで構成されます。@ fun。 と関数の表示名を指定します。
関数
説明
例
@ fun.concat
文字列を1つの文字列に接続します。
出力: 文字列。
入力: 複数の文字列。
@ fun.concat('d', 'm', 's') // 出力は文字列 'dms' です。
@ fun.concat('[開発標準] [', @ fac.column_name, '] フィールドにコメントを入力する必要があります。') // 出力は、チケットを送信したユーザーにフィールドのコメントを入力するように促すメッセージです。
@ fun.char_length
文字列の長さを返します。
出力: 整数。
入力: 文字列。
@ fun.char_length('dms') // 出力は3です。
@ fun.char_length(@ fac.table_name) // 出力はテーブル名の長さです。
@ fun.is_char_lower
文字列内のすべての文字が小文字であるかどうかを評価します。
出力: trueまたはfalse。
入力: 文字列。
@ fun.is_char_lower('dms') // 出力はtrueです。
@ fun.is_char_lower(@ fac.table_name) // テーブル名のすべての文字が小文字の場合、出力はtrueになります。
@ fun.is_char_upper
文字列内のすべての文字が大文字かどうかを評価します。
出力: trueまたはfalse。
入力: 文字列。
@ fun.is_char_upper('dms') // 出力はfalseです。
@ fun.is_char_upper(@ fac.table_name) // テーブル名のすべての文字が大文字の場合、出力はtrueになります。
@ fun.array_size
配列内の値の数をカウントします。
出力: 整数。
入力: 値の配列。
@ fun.array_size([1, 2, 3]) // 3
@ fun.array_size(@ fac.table_index_array) // 出力は、テーブルのインデックスの数です。
@ fun.add
複数の数値を追加します。
出力: 数値。
入力: 複数の数値。
@ fun.add(1, 2, 3) // 6
@ fun.sub
別の数値から数値を引き落とします。
出力: 数値。
入力: 2つの数値。
@ fun.sub(6, 1) // 5
@ fun.between
値が特定の閉じた範囲内にあるかどうかを評価します。 サポートされるデータ型は、NUMERIC、DATE、およびTIMEです。
出力: trueまたはfalse。
入力: 3つの値で構成されます。 第1の値は、評価されるべき値である。 第2の値は下限を示す。 第3の値は上限を示す。
@ fun.between(1, 1, 3) // 値1が [1, 3] に収まるため、出力はtrueです。
@ fun.between(2, 1, 3) // 値2が [1, 3] に収まるため、出力はtrueです。
@ fun.between(7, 1, 3) // 値7が [1, 3] に含まれないため、出力はfalseです。
@ fun.between(@ fac.export_rows, 2001, 100000) // エクスポートされた行の数が [2001, 100000] 以内の場合、出力はtrueです。
@ fun.between(@ fun.current_datetime(), '2019-10-31 00:00:00 ', '2019-11-04 00:00:00') // 現在の日付と時刻が [2019-10-31 00:00:00, 2019-11-04 00:00:00] の場合、出力はtrueになります。
@ fun.between(@ fun.current_date(), '2019-10-31 ', '2019-11-04') // 現在の日付が [2019-10-31, 2019-11-04] の範囲内にある場合、出力はtrueです。
@ fun.current_datetime
yyyy-MM-dd HH:mm:ssの形式で現在の日付と時刻を返します。
出力: 文字列。
入力: なし。
@ fun.current_datetime() // 出力は現在の日付と時刻です。たとえば、2019-10-31 00:00:00です。
@ fun.current_date
yyyy-MM-ddの形式で現在の日付を返します。
出力: 文字列。
入力: なし。
@ fun.current_date() // 出力は現在の日付です (例: 2020-01-13) 。
@ fun.current_time
現在の時刻をHH:mm:ssの形式で返します。
出力: 文字列。
入力: なし。
@ fun.current_time() // 出力は現在の時刻です。たとえば、19:43:20です。
@ fun.is_contain_str
最初の文字列に2番目の文字列が含まれるかどうかを評価します。
出力: trueまたはfalse。
入力: 2つの文字列。
@ fun.is_contain_str('abcd', 'ab') // 最初の文字列abcdに2番目の文字列abが含まれているため、出力はtrueです。
@ fun.listEqualIgnoreOrder
リスト内の文字列の順序と大文字と小文字の区別に関係なく、2つの文字列リストに同じ文字列が含まれるかどうかを評価します。
出力: trueまたはfalse。
入力: 2つの文字列リスト。
@ fun.listEqualIgnoreOrder(['ab','cd'], ['Cd','ab']) // 2つの文字列リストには同じ文字列が含まれているため、出力はtrueです。
@ fun.listEqualIgnoreOrder(@ fac.perm_type, ['QUERY']) // クエリ権限のみが要求されている場合、出力はtrueです。
@ fun.listEqualIgnoreOrder(@ fac.perm_type, ['CORRECT','EXPORT']) // 変更権限とエクスポート権限の両方が要求されている場合、出力はtrueです。
例:
チケット
@act.reject_execute 'The number of SQL statements in a ticket cannot exceed 1,000.'
説明チケット内のSQL文の数が1,000を超えない場合、DMSはSQL文を実行します。 それ以外の場合、DMSはチケットを拒否し、指定されたメッセージを表示します。
DML文
if @fac.sql_type in [ 'UPDATE','DELETE','INSERT','INSERT_SELECT'] then @act.allow_submit end
説明チケット内のSQLステートメントが
UPDATE
、DELETE
、INSERT
、およびINSERT_SELECT
ステートメントの場合、DMSはステートメントの実行を許可します。