データ管理 (DMS) は、SQLレビュー最適化機能をセキュリティルールに統合します。 データ変更のためにSQL文を送信した後、またはSQLConsoleタブで、DMSはセキュリティルールの仕様に基づいて送信されたSQL文をレビューし、最適化の提案を提供します。 これにより、SQL文を確認し、データ変更を実行する前に無効なSQL文を防ぐことができます。 これにより、ビジネスの影響を防ぐこともできます。
前提条件
データベース管理者 (DBA) またはDMS管理者です。 詳細については、「ユーザーの管理」をご参照ください。
セキュリティルールが作成されます。 セキュリティルールの作成方法については、「セキュリティルールの管理」をご参照ください。
次のデータベースエンジンのいずれかが使用されます。
MySQL: ApsaraDB RDS for MySQL、PolarDB for MySQL、ApsaraDB for MariaDB、PolarDB for Xscale、AnalyticDB for MySQL、およびサードパーティのMySQLデータベース
Oracle
PolarDB for PostgreSQL (Oracleと互換)
OceanBase
行動アクション
DMSは3つの動作アクションを事前定義します。
改善する必要があります: SQLステートメントを最適化しない場合、DMSはプロセスを停止し、メッセージを返します。 DMSのデフォルトのSQLレビュールールには、Must Improveは含まれていません。
説明SQLレビュールールのチェック項目の詳細については、「チェック項目」をご参照ください。
たとえば、
テーブルにプライマリキーがある必要がありますルールの動作アクションを [改善する必要があります] に設定した場合、開発者はテーブルを作成するSQL文を送信しますが、テーブルのプライマリキーは指定しません。DMSはSQL文の実行を停止し、開発者にプライマリキーの指定を要求するメッセージを返します。 変更されたSQLステートメントが検証に合格した後、DMSはそれを実行できます。潜在的な問題: DMSは、SQLステートメントに潜在的な問題があることを思い出させますが、プロセスを停止しません。
改善の提案: DMSは、SQLステートメントを最適化することを提案しますが、プロセスを停止しません。
さまざまな制御モードでサポートされる機能
DMSは3つの制御モードを提供する。 詳細については、「制御モード」をご参照ください。
API 操作 | セキュリティコラボレーション | 安定した変化 | 柔軟な管理 |
ルールを有効または無効にします。 | 対応 | 対応 | 対応 |
ルールの動作アクションを設定します。 | 対応 | 非対応 | 非対応 |
ルールのパラメーターを変更します。 テーブル内のインデックスの数やテーブル内のフィールドの数など、特定のルールのパラメーターを設定できます。 | 対応 | 対応 | 非対応 |
動作アクションの説明を入力します。 ルールの行動アクションの背景を入力できます。 | 対応 | 非対応 | 非対応 |
手順
セキュリティルールには、デフォルトの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 SELECTUPDATEまたは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 SELECTINSERT [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