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

Data Management:SQL レビューと最適化の提案の設定

最終更新日:Jun 21, 2026

DMS は、SQL レビューと最適化の提案をセキュリティルールに統合しています。SQL コンソールで、またはデータの変更時に、この機能は送信された SQL 文のコンプライアンスをチェックし、最適化の提案を行います。変更をコミットする前に問題のある SQL を特定して解決できるため、SQL 文の実行後に発生し得る問題やデータベース例外を防止します。

前提条件

  • システムロールが [DBA] または [管理者] である必要があります。詳細については、「ユーザー管理」をご参照ください。

  • セキュリティルールが作成済みである必要があります。詳細については、「セキュリティルールの作成」をご参照ください。

  • データベースタイプ:

    • MySQL: RDS for MySQLPolarDB for MySQL、MariaDB、PolarDB-XAnalyticDB for MySQL、またはその他の MySQL ソース

    • Oracle

    • PolarDB for PostgreSQL (Oracle Compatible)

    • OceanBase

システムアクション

DMS は、3 つの定義済みシステムアクションを提供します:

  • [改善必須]:ステートメントを改善しない場合、システムは自動的にプロセスをブロックし、通知を表示します。初期の SQL レビュー ルールには、[改善必須] に設定されたルールは含まれていません。

    説明

    SQL レビュー ルールが実行するチェック項目の一覧については、「チェック項目」をご参照ください。

    たとえば、テーブルにはプライマリキーが必要です ルールが 改善が必要 に設定されている場合、システムはプライマリキーのないテーブルを作成する SQL ステートメントの実行をブロックし、開発者に対し、実行前に検証に合格するようステートメントを修正することを要求します。

  • 潜在的な問題:SQL ステートメントに問題があることを示しますが、プロセスはブロックされません。

  • 改善の提案:改善が提案されますが、プロセスはブロックされません。

コントロールモード別の機能サポート

DMS には 3 種類のコントロールモードが用意されています。詳細については、「コントロールモード」をご参照ください。

機能

セキュアコラボレーション

安定的な変更

基本運用保守

ルールの有効化または無効化

設定可能

設定可能

設定可能

アクションの設定

設定可能

設定不可

設定不可

ルールパラメーターの変更

一部のルールでは、テーブル内のインデックスまたは列の最大数などのパラメーターを指定できます。

設定可能

設定可能

設定不可

備考の設定

ルールのビジネスコンテキストを設定します。

設定可能

設定不可

設定不可

手順

デフォルトでは、各セキュリティルールには一連の SQL レビュー ルールが含まれています。この例では、テーブルには主キーが必要 ルールを [改善が必要] に設定して、設定をカスタマイズする方法を説明します。

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

  2. 左上隅にある 2023-01-28_15-57-17.png アイコンにポインターを移動し、[すべての機能] > [セキュリティと仕様 ( DBS )] > [セキュリティルール] を選択します。

    説明

    DMS コンソールを通常モードで使用している場合は、上部のナビゲーションバーで [セキュリティと仕様 ( DBS )] > [セキュリティルール] を選択します。

  3. 対象のセキュリティルールの [操作] 列で、[編集] をクリックします。

    説明

    無料操作 または 安定した変更 モードの設定を構成するには、対応するコントロールモードの右側にある Sql監査最適化の推奨事項 をクリックします。

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

  5. テーブルには主キーが必要です ルールについては、アクション列の [編集] をクリックします。

    説明

    [タグ] (ルールが適用されるスコープ (DDL および DML ステートメントを含む))、[アクション]、または [ステータス] (有効または無効) の横にある 筛选按钮 アイコンをクリックすると、ルールをすばやく絞り込むことができます。

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

    [アクション] で使用可能な値には、[潜在的な問題] および [改善提案] も含まれます。

    パラメーター

    説明

    [アクション]

    [アクション][改善が必要] に設定します。

    説明

    デフォルトでは、[改善が必要] に設定されている初期ルールはありません。

    [備考]

    ビジネスコンテキストなど、ルールの備考を入力します。

  7. [OK] をクリックします。

    以降のデータ開発、データ変更、SQL レビューなどのタスクでは、DMS は設定されたセキュリティルールに対して SQL ステートメントをチェックします。

    ステートメントが A table must have a primary key ルールに違反した場合、システムは自動的にプロセスをブロックします。

チェック項目

  • [SQL 仕様チェック]には、次の項目が含まれます。

    テーブルスキーマ定義

    チェック項目

    適用可能な SQL

    ルール名と ID

    データベース属性

    CREATE DATABASE

    データベース作成時の文字セットを制限:CREATE_DATABASE_LIMIT_CHARSET

    テーブル属性

    • CREATE TABLE

    • ALTER TABLE

    • テーブルにはプライマリキーが必要: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

    • カスタム関数を使用しない:TABLE_FORBID_USE_CUSTOM_FUNCTION

    • テーブルの文字セットを変更するには ALTER TABLE CONVERT 構文を使用:MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT

    カラム属性

    • CREATE TABLE

    • ALTER TABLE

    • カラム名にキーワードを使用できない: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

    • 自動インクリメントカラムは符号なしにする必要があります:COLUMN_AUTO_INCREMENT_UNSIGNED

    • float 型または double 型を使用しない (代わりに decimal を使用):COLUMN_FORBID_FLOAT_DOUBLE_TYPE

    • 各カラムにデフォルト値を設定する必要があります:EACH_COLUMN_NEED_DEFAULT_VALUE

    • カラムに照合順序を設定しない:COLUMN_FORBID_SET_COLLATE

    • ALTER TABLE の使用時にカラム名を変更しない:ALTER_TABLE_FORBID_RENAME_COLUMN

    • ALTER TABLE の使用時にカラムを削除しない:ALTER_TABLE_FORBID_DROP_COLUMN

    • ALTER TABLE の使用時にデータ型を変更しない:ALTER_TABLE_FORBID_MODIFY_DATA_TYPE

    • ALTER TABLE で追加する新しいカラムは NULL 許容にする必要があります:ALTER_TABLE_ADD_COLUMN_NULLABLE

    • ALTER TABLE で NULL 非許容のカラムを追加する場合、デフォルト値を指定する必要がある:ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT

    • NULL 許容のカラムを NULL 非許容に変更する場合、デフォルト値を指定する必要がある:COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT

    • enum 型を使用しない (代わりに tinyint または char を使用):COLUMN_FORBID_USE_ENUM_TYPE

    • カラムに ZEROFILL 属性を使用しない:COLUMN_DATA_TYPE_FORBID_ZEROFILL

    インデックス属性

    • CREATE TABLE

    • ALTER TABLE

    • 各インデックスに明示的な名前を付ける必要がある:INDEX_MUST_HAVE_CLEARLY_NAME

    • Unique インデックスの命名パターンを制限: UNIQUE_INDEX_NAME_PATTERN

    • 一般インデックスの命名パターンを制限:COMMON_INDEX_NAME_PATTERN

    • 単一インデックスに含めるカラム数を制限:INDEX_LIMIT_CONTAINS_COLUMNS

    • プライマリキーに含めるカラム数を制限:PRIMARY_LIMIT_CONTAINS_COLUMNS

    • プライマリキーカラムのデータ型を制限:PRIMARY_LIMIT_COLUMN_DATA_TYPE

    • ALTER TABLE の使用時にプライマリキーを削除しない:ALTER_TABLE_FORBID_DROP_PRIMARY

    • ALTER TABLE の使用時にインデックスを削除しない:ALTER_TABLE_FORBID_DROP_INDEX

    データクエリ

    チェック項目

    適用可能な SQL

    ルール名と ID

    SELECT

    • 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 句の offset サイズを制限:SELECT_CONFINE_LIMIT_MAX_OFFSET

    • SELECT 文で HAVING 句を使用しない:SELECT_FORBID_USE_HAVING

    WHERE

    SELECTUPDATEDELETEINSERT SELECT など、WHERE 句を含む文。

    • WHERE 句のインデックス付きカラムで数式演算や関数演算を行わない:WHERE_FORBID_INDEX_COLUMN_HAS_MATH

    • WHERE 句内の検索で先頭ワイルドカードを使用しない:WHERE_FORBID_BEFORE_WILDCARD_SEARCH

    • WHERE 句でワイルドカードがない 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 句におけるカラムの暗黙の型変換をチェック:WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSION

    • WHERE 句で OR 演算子で連結したフィルター条件をチェック:WHERE_CHECK_OR_LINK_CONDITION

    データ変更

    チェック項目

    適用可能な SQL

    ルール名と ID

    データの挿入

    • INSERT SELECT

    • INSERT [IGNORE]

    • REPLACE

    • INSERT 文ではカラムリストを指定することを推奨:ASSIGN_INSERT_COLUMN_NAME_LIST

    • INSERT のカラムリストで重複するカラム名を使用しない:INSERT_COLUMN_NAME_FORBID_DUPLICATE

    • NOT NULL カラムに NULL 値を挿入しない:NOT_NULL_COLUMN_FORBID_INSERT_NULL

    • INSERT 文では、カラムリストと値リストを一致させる必要がある:INSERT_COLUMN_MUST_MATCH_VALUES

    • INSERT VALUES 文に含める合計行数を制限:LIMIT_INSERT_VALUES_TOTAL_ROWS

    • INSERT 文で指定したテーブルまたはカラムが存在するかをチェック:INSERT_CHECK_TABLE_COLUMN_EXISTS

    • 挿入文で SYSDATE() 関数を使用しない:INSERT_FORBID_USE_SYSDATE_FUNCTION

    データの更新と削除

    • UPDATE

    • DELETE

    • UPDATE または DELETE 文で結合するテーブル数を制限:UPDELETE_LIMIT_TABLE_JOIN_COUNT

    • UPDATE または DELETE 文では WHERE 句を指定することを推奨:UPDELETE_ASSIGN_WHERE_CONDITION

    • UPDATE または DELETE 文で、WHERE 句にサブクエリが含まれるかをチェック:UPDELETE_CHECK_WHERE_EXIST_SUB_QUERY

    • LIMIT を使用して UPDATE または DELETE 文が影響する行数を制限:UPDELETE_CHECK_LIMIT_AFFECTED_ROWS

    • UPDATE または DELETE 文で、複数テーブル結合構文が完全かどうかを検出 (例:join 句に on 句がない):UPDELETE_CHECK_TABLE_JOIN_LOSS_ON

    • UPDATE または DELETE 文に ORDER BY 句を含めない:UPDELETE_FORBID_ORDER_BY

    • UPDATE 文のチェック:複数カラム間の SET 区切り文字 (and は無効):UPDATE_CHECK_SET_ITEM_DELIMITER

    • 複数テーブルに対する UPDATESET 句のカラムにテーブルプレフィックスを指定しているかをチェック:UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIX

    • UPDATE 文内のテーブルまたはカラムが存在するかをチェック:UPDATE_CHECK_TABLE_COLUMN_EXIST

    • UPDATE 文がプライマリキーを変更するかをチェック:UPDATE_CHECK_PRIMARY_KEY_CHANGE

    • UPDATE 文が一意キーを変更するかをチェック:UPDATE_CHECK_UNIQUE_KEY_CHANGE

    • UPDATE 文では、テーブルの「modified time」カラムも更新することを推奨:UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMN

    • UPDATE 文でテーブルの「creation time」カラムを更新しない:UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN

  • SQL 最適化の提案には、次のチェック項目が含まれます。

    カテゴリ

    チェック項目

    なし

    • プライマリキーが int 型のテーブルを最適化:OPTIMIZE_PRIMARY_IS_INT_TABLE

    • 自動インクリメントのプライマリキーの残り容量不足を警告:SNIFFING_AUTO_PRIMARY_REMAIN_SPACE

    • 一意キー (UK) に NULL 値が含まれるリスクを警告:SNIFFING_UNIQUE_EXIST_NULL_RISK

    • DDL のテーブルロックまたは変更失敗を警告し、最適化:ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE

    • SQL インジェクションのリスクを検出:CHECK_SQL_INJECTION_RISK

    • 強制インデックス (FORCE INDEX) の使用によるリスクを検出:CHECK_SQL_ASSIGN_FORCE_INDEX

    • 実行計画内のインデックスをチェック:SQL_EXPLAIN_INDEX_CHECK

    • DMS のインデックス分析と提案:DMS_INDEX_ANALYZE_AND_SUGGEST