配置SQL審核優(yōu)化建議
DMS的安全規(guī)則中新接入了SQL審核優(yōu)化建議,在SQLConsole或數(shù)據(jù)變更中,對(duì)提交的SQL語句進(jìn)行規(guī)范審核并提出相關(guān)優(yōu)化建議。可協(xié)助您在提交變更操作前審核、解決問題SQL,規(guī)避潛在問題SQL在變更到數(shù)據(jù)庫(kù)后產(chǎn)生異常。
前提條件
您的系統(tǒng)角色為DBA或管理員,更多信息請(qǐng)參見用戶管理。
已創(chuàng)建安全規(guī)則。具體操作,請(qǐng)參見創(chuàng)建安全規(guī)則。
數(shù)據(jù)庫(kù)類型:
MySQL:RDS MySQL、PolarDB MySQL版、MariaDB、PolarDB分布式版、AnalyticDB for MySQL、其他來源MySQL
Oracle
PolarDB PostgreSQL版(兼容Oracle)
OceanBase
系統(tǒng)行為動(dòng)作
DMS預(yù)定義了三種系統(tǒng)行為動(dòng)作:
必須改進(jìn):若不改進(jìn)該語句,系統(tǒng)會(huì)自動(dòng)阻斷流程,并進(jìn)行相應(yīng)提示,系統(tǒng)初始化SQL審核規(guī)則中不包含必須改進(jìn)。
說明SQL審核規(guī)則的檢測(cè)項(xiàng)請(qǐng)參見檢測(cè)項(xiàng)。
例如:將
表要有主鍵
的規(guī)則設(shè)置為必須改進(jìn),若開發(fā)人員在創(chuàng)建表時(shí)未設(shè)置主鍵,系統(tǒng)將會(huì)攔截SQL語句的執(zhí)行,并要求開發(fā)人員針對(duì)該項(xiàng)規(guī)則進(jìn)行修改,驗(yàn)證通過后才允許系統(tǒng)執(zhí)行。潛在問題:提醒該SQL存在問題,但不會(huì)阻斷流程。
建議改進(jìn):建議進(jìn)行改進(jìn),且不阻斷流程。
不同管控模式下的功能支持情況
DMS提供三種不同的管控模式,更多信息,請(qǐng)參見管控模式。
支持項(xiàng) | 安全協(xié)同 | 穩(wěn)定變更 | 自由操作 |
開啟或關(guān)閉規(guī)則 | 支持 | 支持 | 支持 |
配置行為動(dòng)作 | 支持 | 不支持配置 | 不支持配置 |
更改規(guī)則參數(shù) 部分規(guī)則可填寫參數(shù),例如表的索引數(shù)量、表的字段數(shù)量。 | 支持 | 支持 | 不支持配置 |
配置備注 配置規(guī)則的業(yè)務(wù)背景。 | 支持 | 不支持配置 | 不支持配置 |
操作步驟
安全規(guī)則中已生成默認(rèn)的SQL審核規(guī)則,本示例向您介紹如何進(jìn)行自定義配置,將表要有主鍵
的規(guī)則設(shè)置為必須改進(jìn)。
- 登錄數(shù)據(jù)管理DMS 5.0。
單擊控制臺(tái)左上角的圖標(biāo),選擇
。說明若您使用的是非極簡(jiǎn)模式的控制臺(tái),在頂部菜單欄中,選擇
。單擊目標(biāo)安全規(guī)則右側(cè)操作列下的編輯。
說明若您需要配置自由操作或穩(wěn)定變更的配置項(xiàng),請(qǐng)單擊對(duì)應(yīng)管控模式右側(cè)的SQL審核優(yōu)化建議。
在詳情頁左側(cè)的導(dǎo)航欄中,單擊SQL審核優(yōu)化建議。
單擊
表要有主鍵
規(guī)則右側(cè)的編輯。說明您可以單擊標(biāo)記(規(guī)則生效范圍,目前包含DDL語句、DML語句)、行為動(dòng)作、狀態(tài)(開啟或關(guān)閉規(guī)則)右側(cè)的圖標(biāo),進(jìn)行快速篩選。
在規(guī)則內(nèi)容配置彈窗中,配置如下信息。
參數(shù)名
說明
行為動(dòng)作
將行為動(dòng)作設(shè)置為必須改進(jìn)。
說明系統(tǒng)初始化規(guī)則中不包含必須改進(jìn)。
備注
輸入此規(guī)則的備注信息,如業(yè)務(wù)背景信息。
單擊確定。
在后續(xù)的數(shù)據(jù)開發(fā)、數(shù)據(jù)變更及SQL審核等功能中,SQL審核優(yōu)化建議將根據(jù)配置的安全規(guī)則檢驗(yàn)SQL語句。
若不符合
表要有主鍵
該項(xiàng)規(guī)則,系統(tǒng)會(huì)自動(dòng)阻斷流程。
檢測(cè)項(xiàng)
SQL規(guī)范檢查支持的檢測(cè)項(xiàng)如下。
表結(jié)構(gòu)定義
檢測(cè)項(xiàng)
適用的SQL語句
規(guī)則名稱與規(guī)則標(biāo)識(shí)
庫(kù)屬性
CREATE DATABASE
限制創(chuàng)建庫(kù)的字符集: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
限制表存儲(chǔ)引擎:TABLE_LIMIT_STORE_ENGINE
限制表使用分區(qū)設(shè)置:TABLE_FORBID_USE_PARTITION
表需要包含某些列:TABLE_MUST_HAVE_SOME_COLUMN
限制表字符集:TABLE_MUST_USE_SOME_CHARSET
限制表校驗(yàn)規(guī)則:TABLE_MUST_USE_SOME_COLLATION
表名不能是關(guān)鍵字:TABLE_NAME_FORBID_KEYWORD
限制表索引的數(shù)量:TABLE_LIMIT_INDEX_COUNT
限制表字段的數(shù)量:TABLE_LIMIT_COLUMN_COUNT
限制建表自增初始值:TABLE_LIMIT_INIT_AUTO_INCREMENT
限制主鍵列必須自增:LIMIT_PRIMARY_COLUMN_AUTO_INCREMENT
限制使用視圖:TABLE_FORBID_USE_VIEW
限制使用觸發(fā)器:TABLE_FORBID_USE_TRIGGER
限制使用事件:TABLE_FORBID_USE_EVENT
限制使用存儲(chǔ)過程:TABLE_FORBID_USE_STORED_PROCEDURE
限制使用自定義函數(shù):TABLE_FORBID_USE_CUSTOM_FUNCTION
修改表字符集建議用
ALTER TABLE CONVERT
語法:MODIFY_CHARSET_USE_ALTER_TABLE_CONVERT
列屬性
CREATE TABLE
ALTER TABLE
字段名不能是關(guān)鍵字:COLUMN_NAME_FORBID_KEYWORD
限制字段名大小寫:COLUMN_NAME_LIMIT_CHAR_CASE
不能設(shè)置列的字符集:COLUMN_FORBID_SET_CHARSET
限制列不能使用部分?jǐn)?shù)據(jù)類型:COLUMN_FORBID_DATA_TYPES
列要有注釋:COLUMN_MUST_HAVE_COMMENTS
限制
char
類型字段長(zhǎng)度:COLUMN_LIMIT_CHAR_LENGTH限制
varchar
類型字段長(zhǎng)度:COLUMN_LIMIT_VARCHAR_LENGTH限制列都不可空(
NOT NULL
):COLUMN_MUST_SET_NOT_NULL限制自增列名字為
ID
:COLUMN_AUTO_INCREMENT_NAME_ID限制自增列為無符號(hào):COLUMN_AUTO_INCREMENT_UNSIGNED
不能使用
float
或double
類型(建議用decimal
替換):COLUMN_FORBID_FLOAT_DOUBLE_TYPE每個(gè)列都要有默認(rèn)值:EACH_COLUMN_NEED_DEFAULT_VALUE
不能設(shè)置列的校驗(yàn)集:COLUMN_FORBID_SET_COLLATE
限制修改表重命名列:ALTER_TABLE_FORBID_RENAME_COLUMN
限制修改表刪除列:ALTER_TABLE_FORBID_DROP_COLUMN
修改表禁止更改數(shù)據(jù)類型:ALTER_TABLE_FORBID_MODIFY_DATA_TYPE
修改表新增字段要求可空:ALTER_TABLE_ADD_COLUMN_NULLABLE
修改表新增非空字段時(shí)要明確指定默認(rèn)值:ALTER_ADD_NOT_NULL_COLUMN_NEED_DEFAULT
修改表將可空字段改為非空時(shí)要明確指定默認(rèn)值:COLUMN_NULLABLE_TO_NOT_NEED_DEFAULT
不能使用
enum
類型(建議用tinyint
或char
代替):COLUMN_FORBID_USE_ENUM_TYPE字段禁用
ZEROFILL
屬性:COLUMN_DATA_TYPE_FORBID_ZEROFILL
索引屬性
CREATE TABLE
ALTER TABLE
索引需要設(shè)置名字:INDEX_MUST_HAVE_CLEARLY_NAME
限制
Unique
索引名格式:UNIQUE_INDEX_NAME_PATTERN限制普通索引名格式:COMMON_INDEX_NAME_PATTERN
限制單個(gè)索引包含列的個(gè)數(shù):INDEX_LIMIT_CONTAINS_COLUMNS
限制主鍵包含列的個(gè)數(shù):PRIMARY_LIMIT_CONTAINS_COLUMNS
限制主鍵列類型:PRIMARY_LIMIT_COLUMN_DATA_TYPE
限制修改表刪除主鍵:ALTER_TABLE_FORBID_DROP_PRIMARY
修改表禁止刪除索引:ALTER_TABLE_FORBID_DROP_INDEX
數(shù)據(jù)查詢
檢測(cè)項(xiàng)
適用的SQL語句
規(guī)則名稱與規(guī)則標(biāo)識(shí)
SELECT
SELECT
INSERT SELECT
子查詢(嵌套在
UPDATE
或DELETE
中)
SELECT
語句建議指定WHERE
條件:SELECT_SUGGEST_ASSIGN_WHERESELECT
語句不建議使用ORDER BY RAND()
:SELECT_FORBID_USE_ORDER_BY_RANDSELECT
語句不建議對(duì)常量進(jìn)行GROUP BY
:SELECT_FORBID_GROUP_BY_CONSTSELECT
語句不建議對(duì)常量進(jìn)行ORDER BY
:SELECT_FORBID_ORDER_BY_CONSTSELECT
語句不建議對(duì)不同的表GROUP BY
或ORDER BY
:SELECT_FORBID_GROUP_ORDER_BY_DISTINCT_TABLESELECT
語句不建議ORDER BY
多個(gè)字段使用不同方向排序:SELECT_FORBID_ORDER_BY_MULTI_COLUMN_RANKSELECT
語句不建議GROUP BY
或ORDER BY
表達(dá)式或函數(shù):SELECT_FORBID_GROUP_ORDER_BY_EXPR_OR_FUNCTIONSELECT
語句不建議使用union
:SELECT_FORBID_USE_UNIONSELECT
語句限制多表關(guān)聯(lián)的數(shù)量:SELECT_LIMIT_TABLE_JOIN_COUNTSELECT
語句限制LIMIT
的offset
大小:SELECT_CONFINE_LIMIT_MAX_OFFSETSELECT
語句不建議使用HAVING
子句:SELECT_FORBID_USE_HAVING
WHERE
條件包含
WHERE
條件子句的SELECT
、UPDATE
、DELETE
、INSERT SELECT
語句。WHERE
條件中不建議索引字段包含數(shù)學(xué)運(yùn)算或函數(shù)運(yùn)算:WHERE_FORBID_INDEX_COLUMN_HAS_MATHWHERE
條件中不建議使用前通配符查找:WHERE_FORBID_BEFORE_WILDCARD_SEARCHWHERE
條件中檢測(cè)沒有通配符的LIKE
語句:WHERE_CHECK_LIKE_HAS_NOT_WILDCARDWHERE
條件中不建議使用反向查詢(not in
/not like
):WHERE_FORBID_USE_REVERSE_SEARCHWHERE
條件中限制IN
子句包含元素個(gè)數(shù):WHERE_LIMIT_IN_ITEM_MAX_COUNTWHERE
條件中檢測(cè)字段是否存在隱式類型轉(zhuǎn)換:WHERE_CHECK_COLUMN_IMPLICIT_TYPE_CONVERSIONWHERE
條件中檢測(cè)是否通過OR
操作符連接過濾條件:WHERE_CHECK_OR_LINK_CONDITION
數(shù)據(jù)變更
檢測(cè)項(xiàng)
適用的SQL語句
規(guī)則名稱與規(guī)則標(biāo)識(shí)
插入數(shù)據(jù)
INSERT SELECT
INSERT [IGNORE]
REPLACE
插入語句建議指定
INSERT
字段列表:ASSIGN_INSERT_COLUMN_NAME_LIST插入語句中
INSERT
字段名不能重復(fù):INSERT_COLUMN_NAME_FORBID_DUPLICATE插入語句不能為
NOT NULL
列插入NULL
值:NOT_NULL_COLUMN_FORBID_INSERT_NULL插入語句中
INSERT
字段列表要和值列表匹配:INSERT_COLUMN_MUST_MATCH_VALUES插入語句限制一條
INSERT VALUES
的總行數(shù):LIMIT_INSERT_VALUES_TOTAL_ROWS插入語句檢測(cè)
INSERT
的表或字段是否存在:INSERT_CHECK_TABLE_COLUMN_EXISTS插入語句不建議使用
SYSDATA()
函數(shù):INSERT_FORBID_USE_SYSDATE_FUNCTION
修改、刪除數(shù)據(jù)
UPDATE
DELETE
UPDATE
或DELETE
語句限制多表關(guān)聯(lián)的數(shù)量:UPDELETE_LIMIT_TABLE_JOIN_COUNTUPDATE
或DELETE
語句建議指定WHERE
條件:UPDELETE_ASSIGN_WHERE_CONDITIONUPDATE
或DELETE
語句檢測(cè)WHERE
條件是否包含子查詢:UPDELETE_CHECK_WHERE_EXIST_SUB_QUERYUPDATE
或DELETE
語句限制LIMIT
數(shù)據(jù)量大小:UPDELETE_CHECK_LIMIT_AFFECTED_ROWSUPDATE
或DELETE
語句檢測(cè)多表關(guān)聯(lián)語法是否完整(如join
遺漏on
子句):UPDELETE_CHECK_TABLE_JOIN_LOSS_ONUPDATE
或DELETE
語句不能有ORDER BY
子句:UPDELETE_FORBID_ORDER_BYUPDATE
語句檢測(cè)SET
多個(gè)列之間的分隔符(and
非法):UPDATE_CHECK_SET_ITEM_DELIMITERUPDATE
多表時(shí)檢測(cè)SET
的列是否指定表前綴:UPDATE_MULTI_TABLE_CHECK_SET_COLUMN_PREFIXUPDATE
語句檢測(cè)涉及表或字段是否存在:UPDATE_CHECK_TABLE_COLUMN_EXISTUPDATE
語句檢測(cè)是否更新了主鍵:UPDATE_CHECK_PRIMARY_KEY_CHANGEUPDATE
語句檢測(cè)是否更新了唯一鍵:UPDATE_CHECK_UNIQUE_KEY_CHANGEUPDATE
語句建議同時(shí)更新表上的“修改時(shí)間”列:UPDATE_ALSO_TO_UPDATE_MODIFY_TIME_COLUMNUPDATE
語句不建議更新表上的“創(chuàng)建時(shí)間”列:UPDATE_FORBID_MODIFY_CREATE_TIME_COLUMN
SQL優(yōu)化建議支持的檢測(cè)項(xiàng)如下。
類別
檢測(cè)點(diǎn)
無
優(yōu)化主鍵為
int
類型的表:OPTIMIZE_PRIMARY_IS_INT_TABLE預(yù)警自增主鍵剩余可用空間風(fēng)險(xiǎn):SNIFFING_AUTO_PRIMARY_REMAIN_SPACE
預(yù)警唯一索引
(uk)null
值風(fēng)險(xiǎn):SNIFFING_UNIQUE_EXIST_NULL_RISKDDL鎖表或變更失敗預(yù)警與優(yōu)化:ALTER_LOCK_FAIL_SNIFFING_OPTIMIZE
SQL注入風(fēng)險(xiǎn)檢測(cè):CHECK_SQL_INJECTION_RISK
強(qiáng)制索引
(force index)
風(fēng)險(xiǎn)檢測(cè):CHECK_SQL_ASSIGN_FORCE_INDEX執(zhí)行計(jì)劃索引檢查:SQL_EXPLAIN_INDEX_CHECK
DMS索引分析與推薦:DMS_INDEX_ANALYZE_AND_SUGGEST