データ管理 (DMS) は、SQLレビュー最適化機能をセキュリティルールに統合します。 データ変更のためにSQL文を送信した後、またはSQLConsoleタブで、DMSはセキュリティルールの仕様に基づいて送信されたSQL文をレビューし、最適化の提案を提供します。 これにより、SQL文を確認し、データ変更を実行する前に無効なSQL文を防ぐことができます。 これにより、ビジネスの影響を防ぐこともできます。
前提条件
行動アクション
DMSは3つの動作アクションを事前定義します。
改善する必要があります: SQLステートメントを最適化しない場合、DMSはプロセスを停止し、メッセージを返します。 DMSのデフォルトのSQLレビュールールには、Must Improveは含まれていません。
説明SQLレビュールールのチェック項目の詳細については、「チェック項目」をご参照ください。
たとえば、
テーブルにプライマリキーがある必要があります
ルールの動作アクションを [改善する必要があります] に設定した場合、開発者はテーブルを作成するSQL文を送信しますが、テーブルのプライマリキーは指定しません。DMSはSQL文の実行を停止し、開発者にプライマリキーの指定を要求するメッセージを返します。 変更されたSQLステートメントが検証に合格した後、DMSはそれを実行できます。潜在的な問題: DMSは、SQLステートメントに潜在的な問題があることを思い出させますが、プロセスを停止しません。
改善の提案: DMSは、SQLステートメントを最適化することを提案しますが、プロセスを停止しません。
さまざまな制御モードでサポートされる機能
DMSは3つの制御モードを提供する。 詳細については、「コントロールモード」をご参照ください。
操作 | セキュリティコラボレーション | 安定した変化 | 柔軟な管理 |
ルールを有効または無効にします。 | 対応 | 対応 | 対応 |
ルールの動作アクションを設定します。 | 対応 | 非対応 | 非対応 |
ルールのパラメーターを変更します。 テーブル内のインデックスの数やテーブル内のフィールドの数など、特定のルールのパラメーターを設定できます。 | 対応 | 対応 | 非対応 |
動作アクションの説明を入力します。 ルールの行動アクションの背景を入力できます。 | 対応 | 非対応 | 非対応 |
手順
セキュリティルールには、デフォルトのSQLレビュールールが含まれます。 この例では、セキュリティルールをカスタマイズし、テーブルにプライマリキーが必要です
ルールの動作アクションを [必要な改善] に設定する方法を示します。
DMSコンソールV5.0 にログインします。
上部のナビゲーションバーで、 を選択します。
説明DMSコンソールをシンプルモードで使用する場合は、左上隅のアイコンの上にポインターを移動し、
を選択します。変更するセキュリティルールセットを見つけて、[操作] 列の [編集] をクリックします。
説明無料操作 または 安定した変更 セキュリティルールセットを設定する場合は、設定するセキュリティルールセットを見つけて、[操作] 列の Sql監査最適化の推奨事項 をクリックします。
[詳細] ページの左側のペインで、Sql監査最適化の推奨事項 タブをクリックします。
テーブルにプライマリキーが必要です
という名前のルールを見つけ、[操作] 列の [編集] をクリックします。説明[タグ] 、[行動アクション] 、または [ステータス] の右側にあるアイコンをクリックして、ルールをフィルタリングできます。 Tagパラメーターは、ルールが有効なスコープを指定します。 ルールは、DDLステートメントおよびDMLステートメントに適用できます。 Statusパラメーターは、ルールを有効にするか無効にするかを指定します。
[ルールコンテンツの設定] ダイアログボックスで、次の表に示すパラメーターを設定します。
パラメーター
説明
行動アクション
この例では、Behavioral actionパラメーターを [Must Improve] に設定します。
説明DMSのデフォルトのSQLレビュールールには、Must Improveは含まれていません。
補足
背景情報など、このルールの動作アクションの説明を入力します。
[OK] をクリックします。
データ開発、データ変更、SQLレビューなどの機能を使用する場合、SQLレビュー最適化機能は、設定されたセキュリティルールに基づいてSQL文を検証します。
この例では、SQL文が
the table must have a primary key
ルールに準拠していない場合、DMSはプロセスを停止します。
チェックアイテム
次の表に、SQLレビュー機能でサポートされているチェック項目を示します。
スキーマデザイン
チェックアイテム
該当するSQL文
チェックポイント
データベースのプロパティ
データベースの作成
ルール名: データベースの作成に使用される文字セットは制限されている必要があります。 ルール識別子: CREATE_DATABASE_LIMIT_CHARSET。
表のプロパティ
テーブルの作成
ALTERテーブル
ルール名: テーブルには主キーが必要です。 ルール識別子: TABLE_MUST_HAVE_PRIMARY_KEY
ルール名: テーブルに備考を含める必要があります。 ルール識別子: TABLE_MUST_HAVE_COMMENTS。
ルール名: テーブルに外部キーを含めることはできません。 ルール識別子: TABLE_FORBID_USE_FOREIGN_KEY
ルール名: テーブル名の大文字と小文字の区別を制限する必要があります。 ルール識別子: TABLE_NAME_LIMIT_CHAR_CASE
ルール名: テーブルストレージエンジンを制限する必要があります。 ルール識別子: TABLE_LIMIT_STORE_ENGINE
ルール名: テーブルを分割できません。 ルール識別子: TABLE_FORBID_USE_PARTITION。
ルール名: テーブルに特定の列を含める必要があります。 ルール識別子: TABLE_MUST_HAVE_SOME_COLUMN
ルール名: データベースの文字セットを制限する必要があります。 ルール識別子: TABLE_MUST_USE_SOME_CHARSET
ルール名: テーブルの検証ルールを制限する必要があります。 ルール識別子: TABLE_MUST_USE_SOME_COLLATION
ルール名: テーブル名をキーワードにすることはできません。 ルール識別子: TABLE_NAME_FORBID_KEYWORD。
ルール名: テーブル内のインデックスの数を制限する必要があります。 ルール識別子: TABLE_LIMIT_INDEX_COUNT。
ルール名: テーブル内のフィールド数を制限する必要があります。 ルール識別子: TABLE_LIMIT_COLUMN_COUNT。
ルール名: テーブル内の自動インクリメント列の初期値を制限する必要があります。 ルール識別子: TABLE_LIMIT_INIT_AUTO_INCREMENT。
ルール名: テーブルには、自動インクリメントの主キー列が含まれている必要があります。 ルール識別子: LIMIT_PRIMARY_COLUMN_AUTO_INCREMENT
ルール名: テーブルに対してビューの使用を制限する必要があります。 ルール識別子: TABLE_FORBID_USE_VIEW
ルール名: テーブルに対してトリガーの使用を制限する必要があります。 ルール識別子: TABLE_FORBID_USE_TRIGGER。
ルール名: テーブルに対してイベントの使用を制限する必要があります。 ルール識別子: TABLE_FORBID_USE_EVENT。
ルール名: テーブルに対してストアドプロシージャの使用を制限する必要があります。 ルール識別子: TABLE_FORBID_USE_STORED_PROCEDURE
ルール名: ユーザー定義関数 (UDF) の使用は、テーブルに対して制限する必要があります。 ルール識別子: TABLE_FORBID_USE_CUSTOM_FUNCTION
ルール名:
ALTER TABLE CONVERT
構文を使用して、テーブルの文字セットを変更することを推奨します。 ルール識別子: MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT
列のプロパティ
テーブルの作成
ALTERテーブル
ルール名: フィールド名をキーワードにすることはできません。 ルール識別子: COLUMN_NAME_FORBID_KEYWORD
ルール名: フィールド名の大文字と小文字の区別を制限する必要があります。 ルール識別子: COLUMN_NAME_LIMIT_CHAR_CASE
ルール名: 列の文字セットは指定できません。 ルール識別子: COLUMN_FORBID_SET_CHARSET。
ルール名: 特定のデータ型を列で使用することはできません。 ルール識別子: COLUMN_FORBID_DATA_TYPES。
ルール名: 列にコメントを含める必要があります。 ルール識別子: COLUMN_MUST_HAVE_COMMENTS。
ルール名: データ型が
CHAR
のフィールドの長さを制限する必要があります。 ルール識別子: COLUMN_LIMIT_CHAR_LENGTHルール名: データ型が
VARCHAR
のフィールドの長さを制限する必要があります。 ルール識別子: COLUMN_LIMIT_VARCHAR_LENGTH。ルール名: 各列は
NOT NULL
句を使用する必要があります。 ルール識別子: COLUMN_MUST_SET_NOT_NULL。ルール名: 自動インクリメント列の推奨名は
ID
です。 ルール識別子: COLUMN_AUTO_INCREMENT_NAME_IDルール名: 自動インクリメント列にUNSIGNED属性を含める必要があります。 ルール識別子: COLUMN_AUTO_INCREMENT_UNSIGNED
ルール名:
FLOAT
およびDOUBLE
データ型は使用できません。DECIMAL
データ型に置き換えることを推奨します。 ルール識別子: COLUMN_FORBID_FLOAT_DOUBLE_TYPEルール名: 各列にはデフォルト値が必要です。 ルール識別子: EACH_COLUMN_NEED_DEFAULT_VALUE
ルール名: 列の検証セットは指定できません。 ルール識別子: COLUMN_FORBID_SET_COLLATE
ルール名: テーブルを変更するときに列の名前を変更することはできません。 ルール識別子: ALTER_TABLE_FORBID_RENAME_COLUMN
ルール名: テーブルを変更するときに列を削除することはできません。 ルール識別子: ALTER_TABLE_FORBID_DROP_COLUMN
ルール名: テーブルを変更するときにデータ型を変更することはできません。 ルール識別子: ALTER_TABLE_FORBID_MODIFY_DATA_TYPE
ルール名: テーブルを変更するときに追加されるすべてのフィールドは空にすることができます。 ルール識別子: ALTER_TABLE_ADD_COLUMN_NULLABLE
ルール名: テーブルを変更するときに追加される空でないフィールドには、デフォルト値を指定する必要があります。 ルール識別子: ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT
ルール名: 空のままにできるフィールドが空でないフィールドとして変更される場合、デフォルト値を指定する必要があります。 ルール識別子: COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT
ルール名:
ENUM
データ型は使用できません。TINYINT
またはCHAR
データ型に置き換えることを推奨します。 ルール識別子: COLUMN_FORBID_USE_ENUM_TYPEルール名: フィールドに
ZEROFILL
属性を含めることはできません。 ルール識別子: COLUMN_DATA_TYPE_FORBID_ZEROFILL
インデックスのプロパティ
テーブルの作成
ALTERテーブル
ルール名: インデックスには名前が必要です。 ルール識別子: INDEX_MUST_HAVE_CLEARLY_NAME
ルール名: 一意のインデックスの命名形式を制限する必要があります。 ルール識別子: UNIQUE_INDEX_NAME_PATTERN。
ルール名: 通常のインデックスの命名形式を制限する必要があります。 ルール識別子: COMMON_INDEX_NAME_PATTERN。
ルール名: インデックス列の数を制限する必要があります。 ルール識別子: INDEX_LIMIT_CONTAINS_COLUMNS。
ルール名: 主キー列の数を制限する必要があります。 ルール識別子: PRIMARY_LIMIT_CONTAINS_COLUMNS。
ルール名: 主キー列のデータ型を制限する必要があります。 ルール識別子: PRIMARY_LIMIT_COLUMN_DATA_TYPE。
ルール名: テーブルを変更すると、主キーは削除できません。 ルール識別子: ALTER_TABLE_FORBID_DROP_PRIMARY
ルール名: テーブルを変更すると、インデックスは削除できません。 ルール識別子: ALTER_TABLE_FORBID_DROP_INDEX
データクエリ
チェックアイテム
該当するSQL文
チェックポイント
SELECT
ステートメント選択
INSERT SELECT
UPDATE
またはDELETE
ステートメントでネストされたサブクエリ句
ルール名:
SELECT
文では、WHERE
句を使用することを推奨します。 ルール識別子: SELECT_SUGGEST_ASSIGN_WHEREルール名:
SELECT
文では、ORDER BY RAND()
関数を使用しないことを推奨します。 ルール識別子: SELECT_FORBID_USE_ORDER_BY_RANDルール名:
SELECT
文では、定数に対してGROUP BY
操作を実行しないことを推奨します。 ルール識別子: SELECT_FORBID_GROUP_BY_CONST。ルール名:
SELECT
ステートメントでは、定数に対してORDER BY
操作を実行しないことを推奨します。 ルール識別子: SELECT_FORBID_ORDER_BY_CONST。ルール名:
SELECT
文では、異なるテーブルに対してGROUP BY
またはORDER BY
操作を実行しないことを推奨します。 ルール識別子: SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLEルール名:
SELECT
ステートメントで、ORDER BY
操作を実行して、複数のフィールドを異なる順序方向に並べ替えることは推奨しません。 ルール識別子: SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANKルール名:
SELECT
文では、式または関数でGROUP BY
句またはORDER BY
句を使用しないことを推奨します。 ルール識別子: SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTIONルール名:
SELECT
文では、UNION
演算子を使用しないことを推奨します。 ルール識別子: SELECT_FORBID_USE_UNION。ルール名:
SELECT
文では、結合するテーブルの数が制限されています。 ルール識別子: SELECT_LIMIT_TABLE_JOIN_COUNTルール名:
SELECT
文では、LIMIT
句のオフセット値が制限されています。 ルール識別子: SELECT_CONFINE_LIMIT_MAX_OFFSET。ルール名:
SELECT
文では、HAVING
句を使用しないことを推奨します。 ルール識別子: SELECT_FORBID_USE_HAVING。
WHERE
句WHERE
句を含むSELECT
、UPDATE
、DELETE
、またはINSERT SELECT
ステートメント。ルール名:
WHERE
句では、インデックスを作成するフィールドに数学演算子や関数を含めることはできません。 ルール識別子: WHERE_FORBID_INDEX_COLUMN_HAS_MATHルール名:
WHERE
句では、フィールドの検索にワイルドカードを使用しないことを推奨します。 ルール識別子: WHERE_FORBID_BEFORE_WILDCARD_SEARCHルール名:
WHERE
句で、DMSはLIKE
句にワイルドカードが含まれているかどうかを確認します。 ルール識別子: WHERE_CHECK_LIKE_HAS_NOT_WILDCARDルール名:
WHERE
句では、not In
やNOT LIKE
などの逆クエリを使用しないことを推奨します。 ルール識別子: WHERE_FORBID_USE_REVERSE_SEARCHルール名:
WHERE
句では、In
句の要素数が制限されています。 ルール識別子: WHERE_LIMIT_IN_ITEM_MAX_COUNTルール名:
WHERE
句で、DMSはフィールドのデータ型が暗黙的に変換されているかどうかを確認します。 ルール識別子: WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSIONルール名:
WHERE
句で、DMSはOR
演算子を使用してフィルター条件が接続されているかどうかを確認します。 ルール識別子: WHERE_CHECK_OR_LINK_CONDITION
データ変更
チェックアイテム
該当するSQL文
チェックポイント
データ挿入
INSERT SELECT
INSERT [IGNORE]
交換
ルール名:
INSERT
文で、データを挿入するフィールドのリストを指定することを推奨します。 ルール識別子: ASSIGN_INSERT_COLUMN_NAME_LISTルール名:
INSERT
文では、データを挿入するフィールドの名前を重複させることはできません。 ルール識別子: INSERT_COLUMN_NAME_FORBID_DUPLICATEルール名: INSERT文で、
NULL
値をNOT NULL
列に挿入することはできません。 ルール識別子: NOT_NULL_COLUMN_FORBID_INSERT_NULLルール名:
INSERT
文では、データを挿入するフィールドのリストが、挿入する値のリストと一致している必要があります。 ルール識別子: INSERT_COLUMN_MUST_MATCH_VALUESルール名: INSERT文では、
INSERT VALUES
句の行の総数が制限されています。 ルール識別子: LIMIT_INSERT_VALUES_TOTAL_ROWS。ルール名:
INSERT
文で、DMSはデータを挿入するテーブルまたはフィールドが存在するかどうかを確認します。 ルール識別子: INSERT_CHECK_TABLE_COLUMN_EXISTSルール名: INSERTステートメントでは、
SYSDATA()
関数を使用しないことを推奨します。 ルール識別子: INSERT_FORBID_USE_SYSDATE_FUNCTION
データの更新と削除
更新
削除
ルール名:
UPDATE
またはDELETE
ステートメントでは、結合するテーブルの数が制限されています。 ルール識別子: UPDELETE_LIMIT_TABLE_JOIN_COUNTルール名:
UPDATE
またはDELETE
文では、WHERE
句を使用することを推奨します。 ルール識別子: UPDELETE_ASSIGN_WHERE_CONDITIONルール名:
UPDATE
またはDELETE
ステートメントで、DMSはWHERE
句にサブクエリが含まれているかどうかを確認します。 ルール識別子: UPDELETE_CHECK_WHERE_EXIST_SUB_QUERYルール名:
UPDATE
またはDELETE
文では、LIMIT
句で指定されたデータサイズが制限されています。 ルール識別子: UPDELETE_CHECK_LIMIT_AFFECTED_ROWSルール名:
UPDATE
またはDELETE
ステートメントで、DMSは複数のテーブルの結合に使用される構文が完了しているかどうかを確認します。 たとえば、DMSは、JOIN
句でON
句が省略されているかどうかを確認します。 ルール識別子: UPDELETE_CHECK_TABLE_JOIN_LOSS_ONルール名:
UPDATE
またはDELETE
ステートメントにORDER BY
句を含めることはできません。 ルール識別子: UPDELETE_FORBID_ORDER_BY。ルール名:
UPDATE
文で、DMSは、SET
句の複数の列のAND
などの区切り文字が有効かどうかを確認します。 ルール識別子: UPDATE_CHECK_SET_ITEM_DELIMITERルール名:
UPDATE
文で、DMSは、SET
句の複数のテーブルの列にテーブルプレフィックスが指定されているかどうかを確認します。 ルール識別子: UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIXルール名:
UPDATE
文で、DMSは更新するテーブルまたはフィールドが存在するかどうかを確認します。 ルール識別子: UPDATE_CHECK_TABLE_COLUMN_EXISTルール名:
UPDATE
文で、DMSはプライマリキーが更新されているかどうかを確認します。 ルール識別子: UPDATE_CHECK_PRIMARY_KEY_CHANGEルール名:
UPDATE
文で、DMSは一意のキーが更新されているかどうかを確認します。 ルール識別子: UPDATE_CHECK_UNIQUE_KEY_CHANGEルール名:
UPDATE
文では、テーブルの [時間の変更] 列も更新することを推奨します。 ルール識別子: UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMNルール名:
UPDATE
文では、テーブルの作成時刻列を更新しないことを推奨します。 ルール識別子: UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN
次の表に、SQLレビュー最適化機能でサポートされているチェック項目を示します。
シナリオ
チェックポイント
非該当
ルール名: プライマリキーが
INT
データ型を使用するテーブルを最適化する必要があります。 ルール識別子: OPTIMIZE_PRIMARY_IS_INT_TABLEルール名: 自動インクリメントの主キー列には十分なスペースが必要です。 ルール識別子: SNIFFING_AUTO_PRIMARY_REMAIN_SPACE
ルール名: 一意のインデックスの値を空にすることはできません。 ルール識別子: SNIFFING_UNIQUE_EXIST_NULL_RISK
ルール名: データ変更の失敗やテーブルロックのリスクがあるため、DDLステートメントを最適化する必要があります。 ルール識別子: ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE
ルール名: SQLインジェクションのリスクを検出する必要があります。 ルール識別子: CHECK_SQL_INJECTION_RISK。
ルール名:
フォースインデックス
のリスクを検出する必要があります。 ルール識別子: CHECK_SQL_ASSIGN_FORCE_INDEXルール名: SQL実行プランでインデックスをチェックする必要があります。 ルール識別子: SQL_EXPLAIN_INDEX_CHECK。
ルール名: DMSはインデックスを分析し、提案を提供する必要があります。 ルール識別子: DMS_INDEX_ANALYZE_AND_SUGGEST