DMS は、SQL レビューと最適化の提案をセキュリティルールに統合しています。SQL コンソールで、またはデータの変更時に、この機能は送信された SQL 文のコンプライアンスをチェックし、最適化の提案を行います。変更をコミットする前に問題のある SQL を特定して解決できるため、SQL 文の実行後に発生し得る問題やデータベース例外を防止します。
前提条件
-
システムロールが [DBA] または [管理者] である必要があります。詳細については、「ユーザー管理」をご参照ください。
-
セキュリティルールが作成済みである必要があります。詳細については、「セキュリティルールの作成」をご参照ください。
-
データベースタイプ:
-
MySQL: RDS for MySQL、PolarDB for MySQL、MariaDB、PolarDB-X、AnalyticDB for MySQL、またはその他の MySQL ソース
-
Oracle
-
PolarDB for PostgreSQL (Oracle Compatible)
-
OceanBase
-
システムアクション
DMS は、3 つの定義済みシステムアクションを提供します:
-
[改善必須]:ステートメントを改善しない場合、システムは自動的にプロセスをブロックし、通知を表示します。初期の SQL レビュー ルールには、[改善必須] に設定されたルールは含まれていません。
説明SQL レビュー ルールが実行するチェック項目の一覧については、「チェック項目」をご参照ください。
たとえば、
テーブルにはプライマリキーが必要ですルールが改善が必要に設定されている場合、システムはプライマリキーのないテーブルを作成する SQL ステートメントの実行をブロックし、開発者に対し、実行前に検証に合格するようステートメントを修正することを要求します。 -
潜在的な問題:SQL ステートメントに問題があることを示しますが、プロセスはブロックされません。
-
改善の提案:改善が提案されますが、プロセスはブロックされません。
コントロールモード別の機能サポート
DMS には 3 種類のコントロールモードが用意されています。詳細については、「コントロールモード」をご参照ください。
|
機能 |
セキュアコラボレーション |
安定的な変更 |
基本運用保守 |
|
ルールの有効化または無効化 |
設定可能 |
設定可能 |
設定可能 |
|
アクションの設定 |
設定可能 |
設定不可 |
設定不可 |
|
ルールパラメーターの変更 一部のルールでは、テーブル内のインデックスまたは列の最大数などのパラメーターを指定できます。 |
設定可能 |
設定可能 |
設定不可 |
|
備考の設定 ルールのビジネスコンテキストを設定します。 |
設定可能 |
設定不可 |
設定不可 |
手順
デフォルトでは、各セキュリティルールには一連の SQL レビュー ルールが含まれています。この例では、テーブルには主キーが必要 ルールを [改善が必要] に設定して、設定をカスタマイズする方法を説明します。
DMSコンソールV5.0 にログインします。
左上隅にある
アイコンにポインターを移動し、 を選択します。説明DMS コンソールを通常モードで使用している場合は、上部のナビゲーションバーで を選択します。
-
対象のセキュリティルールの [操作] 列で、[編集] をクリックします。
説明無料操作 または 安定した変更 モードの設定を構成するには、対応するコントロールモードの右側にある Sql監査最適化の推奨事項 をクリックします。
-
[詳細] ページの左側のナビゲーションペインで、Sql監査最適化の推奨事項 をクリックします。
-
テーブルには主キーが必要ですルールについては、アクション列の [編集] をクリックします。説明[タグ] (ルールが適用されるスコープ (DDL および DML ステートメントを含む))、[アクション]、または [ステータス] (有効または無効) の横にある
アイコンをクリックすると、ルールをすばやく絞り込むことができます。 -
[ルールコンテンツの設定] ダイアログボックスで、次のパラメーターを設定します。
[アクション] で使用可能な値には、[潜在的な問題] および [改善提案] も含まれます。
パラメーター
説明
[アクション]
[アクション] を [改善が必要] に設定します。
説明デフォルトでは、[改善が必要] に設定されている初期ルールはありません。
[備考]
ビジネスコンテキストなど、ルールの備考を入力します。
-
[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句SELECT、UPDATE、DELETE、INSERT 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 INやNOT 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 -
複数テーブルに対する
UPDATE:SET句のカラムにテーブルプレフィックスを指定しているかをチェック: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
-