全部產品
Search
文件中心

:配置SQL審核最佳化建議

更新時間:Nov 16, 2024

DMS的安全規則中新接入了SQL審核最佳化建議,在SQLConsole或資料變更中,對提交的SQL語句進行規範審核並提出相關最佳化建議。可協助您在提交變更操作前審核、解決問題SQL,規避潛在問題SQL在變更到資料庫後產生異常。

前提條件

  • 您的系統角色為DBA管理員,更多資訊請參見使用者管理

  • 已建立安全規則。具體操作,請參見建立安全規則

  • 資料庫類型:

    • MySQL:RDS MySQLPolarDB MySQL版、MariaDB、PolarDB分布式版AnalyticDB for MySQL、其他來源MySQL

    • Oracle

    • PolarDB PostgreSQL版(相容Oracle)

    • OceanBase

系統行為動作

DMS預定義了三種系統行為動作:

  • 必須改進:若不改進該語句,系統會自動阻斷流程,並進行相應提示,系統初始化SQL審核規則中不包含必須改進

    說明

    SQL審核規則的檢測項請參見檢測項

    例如:將表要有主鍵的規則設定為必須改進,若開發人員在建立表時未設定主鍵,系統將會攔截SQL語句的執行,並要求開發人員針對該項規則進行修改,驗證通過後才允許系統執行。

  • 潛在問題:提醒該SQL存在問題,但不會阻斷流程。

  • 建議改進:建議進行改進,且不阻斷流程。

不同管控模式下的功能支援情況

DMS提供三種不同的管控模式,更多資訊,請參見管控模式

支援項

安全協同

穩定變更

自由操作

開啟或關閉規則

支援

支援

支援

配置行為動作

支援

不支援配置

不支援配置

更改規則參數

部分規則可填寫參數,例如表的索引數量、表的欄位數量。

支援

支援

不支援配置

配置備忘

配置規則的業務背景。

支援

不支援配置

不支援配置

操作步驟

安全規則中已產生預設的SQL審核規則,本樣本向您介紹如何進行自訂配置,將表要有主鍵的規則設定為必須改進

  1. 登入Data Management 5.0
  2. 單擊控制台左上方的2023-01-28_15-57-17.png表徵圖,選擇全部功能 > 安全與規範 > 安全規則

    說明

    若您使用的是非極簡模式的控制台,在頂部功能表列中,選擇安全與規範 > 安全規則

  3. 單擊目標安全規則右側操作列下的編輯

    說明

    若您需要配置自由操作穩定變更的配置項,請單擊對應管控模式右側的SQL審核優化建議

  4. 詳情頁左側的導覽列中,單擊SQL審核優化建議

  5. 單擊表要有主鍵規則右側的編輯

    編輯SQL審核規則

    說明

    您可以單擊標記(規則生效範圍,目前包含DDL語句、DML語句)、行為動作狀態(開啟或關閉規則)右側的篩選按鈕表徵圖,進行快速篩選。

  6. 規則內容配置彈窗中,配置如下資訊。

    規則內容配置

    參數名

    說明

    行為動作

    行為動作設定為必須改進

    說明

    系統初始化規則中不包含必須改進

    備忘

    輸入此規則的備忘資訊,如業務背景資訊。

  7. 單擊確定

    在後續的資料開發、資料變更及SQL審核等功能中,SQL審核最佳化建議將根據配置的安全規則檢驗SQL語句。

    若不符合表要有主鍵該項規則,系統會自動阻斷流程。

檢測項

  • SQL規範檢查支援的檢測項如下。

    表結構定義

    檢測項

    適用的SQL語句

    規則名稱與規則標識

    庫屬性

    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

    • 不能使用floatdouble類型(建議用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類型(建議用tinyintchar代替):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_FORBID_DROP_PRIMARY

    • 修改表禁止刪除索引:ALTER_TABLE_FORBID_DROP_INDEX

    資料查詢

    檢測項

    適用的SQL語句

    規則名稱與規則標識

    SELECT

    • SELECT

    • INSERT SELECT

    • 子查詢(嵌套在UPDATEDELETE中)

    • 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 BYORDER BY:SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLE

    • SELECT語句不建議ORDER BY多個欄位使用不同方向排序:SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANK

    • SELECT語句不建議GROUP BYORDER BY運算式或函數:SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTION

    • SELECT語句不建議使用union:SELECT_FORBID_USE_UNION

    • SELECT語句限制多表關聯的數量:SELECT_LIMIT_TABLE_JOIN_COUNT

    • SELECT語句限制LIMIToffset大小:SELECT_CONFINE_LIMIT_MAX_OFFSET

    • SELECT語句不建議使用HAVING子句:SELECT_FORBID_USE_HAVING

    WHERE條件

    包含WHERE條件子句的SELECTUPDATEDELETEINSERT SELECT語句。

    • 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語句

    規則名稱與規則標識

    插入資料

    • 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

    • 插入語句不建議使用SYSDATA()函數:INSERT_FORBID_USE_SYSDATE_FUNCTION

    修改、刪除資料

    • UPDATE

    • DELETE

    • UPDATEDELETE語句限制多表關聯的數量:UPDELETE_LIMIT_TABLE_JOIN_COUNT

    • UPDATEDELETE語句建議指定WHERE條件:UPDELETE_ASSIGN_WHERE_CONDITION

    • UPDATEDELETE語句檢測WHERE條件是否包含子查詢:UPDELETE_CHECK_WHERE_EXIST_SUB_QUERY

    • UPDATEDELETE語句限制LIMIT資料量大小:UPDELETE_CHECK_LIMIT_AFFECTED_ROWS

    • UPDATEDELETE語句檢測多表關聯文法是否完整(如join遺漏on子句):UPDELETE_CHECK_TABLE_JOIN_LOSS_ON

    • UPDATEDELETE語句不能有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語句建議同時更新表上的“修改時間”列: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

    • 預警唯一索引(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