すべてのプロダクト
Search
ドキュメントセンター

Data Management:セキュリティルールのDSL構文

最終更新日:Aug 08, 2024

データ管理 (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つ以上のコネクタ、演算子、および要素で構成されます。 コネクタはANDORです。 因子は、所定のシステム変数である。 次の例は有効な条件句です。

    true                    // This is the simplest conditional clause. The result is true. 
     
     
     
    説明

    これらのサンプル条件節の結果はすべてtrueです。

    • コネクタ

      コネクタはANDORです。 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

      環境のタイプ。 値は、DEVPRODUCTなどの環境タイプの表示名です。 詳細については、「インスタンスの環境タイプの変更」をご参照ください。

      @ fac.sql_type

      SQL 文のタイプです。 値は、UPDATEINSERTなどの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ステートメントがUPDATEDELETEINSERT、およびINSERT_SELECTステートメントの場合、DMSはステートメントの実行を許可します。