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

Data Management:SQLレビューの最適化

最終更新日:Aug 02, 2024

データ管理 (DMS) は、SQLレビュー最適化機能をセキュリティルールに統合します。 データ変更のためにSQL文を送信した後、またはSQLConsoleタブで、DMSはセキュリティルールの仕様に基づいて送信されたSQL文をレビューし、最適化の提案を提供します。 これにより、SQL文を確認し、データ変更を実行する前に無効なSQL文を防ぐことができます。 これにより、ビジネスの影響を防ぐこともできます。

前提条件

  • データベース管理者 (DBA) またはDMS管理者です。 詳細については、「」をご参照ください。

  • セキュリティルールが作成されます。 セキュリティルールの作成方法については、「」をご参照ください。

  • 次のデータベースエンジンのいずれかが使用されます。

    • MySQL: Alibaba CloudにないApsaraDB RDS for MySQLデータベース、PolarDB for MySQL、MariaDBデータベース、、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つの制御モードを提供する。 詳細については、「コントロールモード」をご参照ください。

操作

セキュリティコラボレーション

安定した変化

柔軟な管理

ルールを有効または無効にします。

対応

対応

対応

ルールの動作アクションを設定します。

対応

非対応

非対応

ルールのパラメーターを変更します。

テーブル内のインデックスの数やテーブル内のフィールドの数など、特定のルールのパラメーターを設定できます。

対応

対応

非対応

動作アクションの説明を入力します。

ルールの行動アクションの背景を入力できます。

対応

非対応

非対応

手順

セキュリティルールには、デフォルトのSQLレビュールールが含まれます。 この例では、セキュリティルールをカスタマイズし、テーブルにプライマリキーが必要ですルールの動作アクションを [必要な改善] に設定する方法を示します。

  1. DMSコンソールV5.0 にログインします。

  2. 上部のナビゲーションバーで、セキュリティと仕様> 権限センター> 権限テンプレート を選択します。

    説明

    DMSコンソールをシンプルモードで使用する場合は、左上隅の2023-01-28_15-57-17.pngアイコンの上にポインターを移動し、[すべての機能] > [セキュリティと仕様] > [権限センター] > [権限テンプレート] を選択します。

  3. 変更するセキュリティルールセットを見つけて、[操作] 列の [編集] をクリックします。

    Edit a security rule

    説明

    無料操作 または 安定した変更 セキュリティルールセットを設定する場合は、設定するセキュリティルールセットを見つけて、[操作] 列の Sql監査最適化の推奨事項 をクリックします。

  4. [詳細] ページの左側のペインで、Sql監査最適化の推奨事項 タブをクリックします。

  5. テーブルにプライマリキーが必要ですという名前のルールを見つけ、[操作] 列の [編集] をクリックします。

    Edit an SQL review rule

    説明

    [タグ][行動アクション] 、または [ステータス] の右側にあるFilter iconアイコンをクリックして、ルールをフィルタリングできます。 Tagパラメーターは、ルールが有効なスコープを指定します。 ルールは、DDLステートメントおよびDMLステートメントに適用できます。 Statusパラメーターは、ルールを有効にするか無効にするかを指定します。

  6. [ルールコンテンツの設定] ダイアログボックスで、次の表に示すパラメーターを設定します。

    Rule content configuration

    パラメーター

    説明

    行動アクション

    この例では、Behavioral actionパラメーターを [Must Improve] に設定します。

    説明

    DMSのデフォルトのSQLレビュールールには、Must Improveは含まれていません。

    補足

    背景情報など、このルールの動作アクションの説明を入力します。

  7. [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句を含むSELECTUPDATEDELETE、または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 InNOT 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