前提條件
- 用戶需要具有進入SQL規范界面的菜單權限。菜單權限請參考權限說明。
- SQL規范為企業版功能,目前支持MySQL、PostgreSQL、DRDS三種數據庫類型。
注意事項
SQL規范與實例關聯,DMS系統針對每種數據庫提供默認的SQL規范,默認規范不可刪除。
操作步驟
- 用戶登錄DMS系統。
- 在左側菜單欄依次選擇SQL治理 > SQL規范。
規范審核結果
DMS定義了兩種規范審核結果:
- 強制改進:SQL審核存在強制改進項會阻斷用戶在查詢窗口、SQL變更、實例管理進行的執行動作。用戶將強制改進項修改之后才能正常執行SQL。
- 建議改進:SQL審核存在建議改進項不會阻斷用戶的執行動作,但是會把改進項提示給用戶。
功能介紹
DMS提供了搜索規范、創建SQL規范、刪除SQL規范、編輯SQL規范、編輯SQL規范內規則、將SQL規范與實例關聯等豐富的功能。
創建SQL規范
用戶可以根據數據庫類型創建不同的SQL規范,創建方式有直接創建和復制創建兩種。創建好的SQL規范會包含默認的規則集,用戶可根據自身需求調整規則內容,并與相應的實例進行關聯。
刪除SQL規范
用戶可以刪除無用的SQL規范,需要注意的是,默認規范不可刪除,與實例關聯的規范不可刪除。
編輯SQL規范
用戶可以編輯非內置SQL規范的規范名稱和描述,對不同的SQL規范進行區分。
搜索SQL規范
用戶可以通過規范名稱對SQL規范進行模糊搜索。
關聯實例
用戶可以在SQL規范列表界面點擊關聯實例,在彈出的實例列表中選擇實例與SQL規范關聯。此外用戶可以點擊已關聯實例,查看與當前SQL規范關聯的實例列表信息。
編輯規則
用戶可以在SQL規范列表界面點擊編輯,進入規則編輯界面。在此界面,用戶可以通過規則類型、規則級別、規則名稱對規則進行查詢,也可以編輯規則的生效狀態、規則級別、某些規則的參數值、描述等內容。
規則內容
MySQL數據庫默認SQL規范包含43條規則,DRDS數據庫默認SQL規范包含27條規則,PostgreSQL數據庫默認SQL規范包含53條規則,具體如下表:
規則類型 適用的數據庫 適用的SQL語句 規則名稱 在線/離線規則 庫 MySQL、PostgreSQL CREATE DATABASE 限制創建庫的字符集 離線
表
MySQL、PostgreSQL
CREATE TABLE
表要有主鍵 離線 MySQL、PostgreSQL 表要有備注 離線 MySQL、PostgreSQL 限制表名大小寫 離線 MySQL 限制表存儲引擎 離線 MySQL、PostgreSQL 禁止使用分區表 離線 MySQL、PostgreSQL 表要包含哪些列 離線 MySQL 限制表字符集 離線 MySQL、PostgreSQL 表名不能是關鍵字 離線 MySQL、PostgreSQL 限制表字段數量 離線
列
MySQL、PostgreSQL
CREATE TABLE
字段名不能是關鍵字 離線 MySQL、PostgreSQL 限制字段名大小寫 離線 MySQL 不能設置列的字符集 離線 MySQL、PostgreSQL 限制列不能使用部分數據類型 離線 MySQL、PostgreSQL 列要有注釋并限制長度 離線 MySQL、PostgreSQL 限制char類型字段長度 離線 MySQL、PostgreSQL 限制varchar類型字段長度 離線
索引
PostgreSQL CREATE INDEX 建議以create index concurrently方式創建索引 離線 MySQL、PostgreSQL CREATE TABLE 限制單表中索引數量 離線
更新
MySQL、DRDS
UPDATE/DELETE
update/delete語句限制多表關聯的數量 離線 MySQL、DRDS、PostgreSQL update/delete語句建議指定where條件 離線 MySQL、DRDS、PostgreSQL update/delete語句檢測where條件是否包含子查詢 離線 MySQL、DRDS update/delete語句不能有order by子句 離線 MySQL、DRDS、PostgreSQL update/delete語句檢測涉及表/字段是否存在 在線(檢測該規則需連接數據庫實例) MySQL、DRDS、PostgreSQL 限制某些表UPDATE/DELETE單個語句的總影響行數? 在線(檢測該規則需連接數據庫實例) MySQL、DRDS、PostgreSQL update語句檢測是否更新了主鍵 在線(檢測該規則需連接數據庫實例) PostgreSQL update語句檢測是否更新了唯一鍵 離線 DRDS 禁止使用truncate table語句 離線 DRDS update/delete語句不能帶limit條件 離線
寫入
MySQL、DRDS、PostgreSQL
INSERT
插入語句建議指定insert字段列表 離線 插入語句中insert字段名不能重復 離線 插入語句中insert字段列表要和值列表匹配 離線 插入語句限制一條insert values的總行數 離線 插入語句檢測insert的表/字段是否存在 在線(檢測該規則需連接數據庫實例) PostgreSQL 插入語句不能為not null列插入null值 在線(檢測該規則需連接數據庫實例)
查詢
MySQL、DRDS、PostgreSQL
SELECT
select語句不建議group by或order by表達式或函數 離線 select語句不建議order by多個字段使用不同方向排序 離線 select語句不建議使用having子句 離線 select語句不建議使用order by rand() 離線 select語句不建議使用select * 離線 select語句不建議使用union 離線 select語句不建議對不同的表group by或order by 離線 select語句建議指定where條件 離線 select語句限制limit的offset大小 離線 select語句限制多表關聯的數量 離線 MySQL、DRDS 多表關聯的select語句建議指定where條件 離線 PostgreSQL 多表關聯的select語句建議指定關聯條件 離線
對象
PostgreSQL
CREATE
對象名稱禁止包含中文 離線 PostgreSQL 對象名稱禁止以pg_、pgxc、sys_、__或者數字開頭 離線 PostgreSQL 對象名稱禁止使用雙引號 離線 PostgreSQL 限制對象名長度 離線 PostgreSQL 禁止使用觸發器 離線 PostgreSQL 禁止使用函數 在線(檢測該規則需連接數據庫實例) PostgreSQL 禁止使用存儲過程 離線 系統 PostgreSQL ALTER 禁止關閉autovacuum 離線
語句
PostgreSQL
包含WHERE條件子句的SELECT、UPDATE、DELETE語句等
禁止在where條件中使用前綴是%的like語法 離線 PostgreSQL 使用IS NULL判斷是否為NULL值 離線 PostgreSQL 禁止在where條件中使用<>或者!=操作符 離線 PostgreSQL 不建議使用cascade 離線 MySQL、DRDS、PostgreSQL
where條件中不建議使用反向查詢(not in/not like) 離線 where條件中檢測是否通過“or”操作符連接過濾條件 離線