本文介紹云數據庫 SelectDB 版提供的SQL查詢攔截相關功能,幫助您進行SQL管理。
概述
在生產環境的部分場景下,需要對可執行的SQL語句做出限制,例如屏蔽刪除或某些已知的高風險查詢語句。為滿足此類場景需求,SelectDB提供了SQL查詢攔截功能。當您在SelectDB上執行的SQL命中了攔截規則,SelectDB將不允許該SQL執行,并返回錯誤信息。
創建攔截規則
創建SQL攔截規則可用于限制任何SQL語句(包括DDL和DML語句)。支持按數據庫賬號配置SQL黑名單。
SQL攔截規則可通過以下方式進行配置:
通過正則匹配的方式拒絕指定的SQL。
通過設置partition_num、tablet_num、cardinality,檢查一個查詢是否達到其中一個限制。這幾個查詢配置項可以同時設置,一旦查詢觸發其中任何一個限制,就會觸發攔截。
語法
CREATE SQL_BLOCK_RULE rule_name
[PROPERTIES ("key"="value", ...)];
參數說明
參數名稱 | 必填 | 參數說明 |
rule_name | 是 | 規則名稱。 |
PROPERTIES | 是 | 具體屬性,詳細說明請參見下文。 |
常用的PROPERTIES參數如下。
參數名稱 | 必填 | 參數說明 |
sql | 否 | 匹配規則(基于正則匹配,特殊字符需要轉譯。如 |
sqlHash | 否 | SQL Hash值,用于完全匹配。默認值為NULL。 |
partition_num | 否 | 一個掃描節點會掃描的最大Partition數量。默認值為0L,不限制。 |
tablet_num | 否 | 一個掃描節點會掃描的最大Tablet數量。默認值為0L,不限制。 |
cardinality | 否 | 一個掃描節點粗略的掃描行數。默認值為0L,不限制。 |
global | 否 | 是否全局(對所有用戶)生效。默認值為false。 |
enable | 否 | 是否開啟阻止規則。默認值為true。 |
使用示例
創建一個名稱為test_rule的阻止規則,示例如下。
CREATE SQL_BLOCK_RULE test_rule PROPERTIES( "sql"="select \\* from order_analysis", "global"="false", "enable"="true", "sqlHash"="" )
當執行SQL名字上述攔截規則時,會返回如下錯誤提醒。
SELECT * FROM order_analysis; ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: order_analysis_rule
創建test_rule2,將最大掃描的分區數量限制在30個,最大掃描基數限制在100億行,示例如下。
CREATE SQL_BLOCK_RULE test_rule2 PROPERTIES ( "partition_num" = "30", "cardinality" = "10000000000", "global" = "false", "enable" = "true" ); Query OK, 0 rows affected (0.01 sec)
創建包含特殊字符的SQL BLOCK RULE,示例如下。正則表達式中
(
和)
符號是特殊符號,所以需要轉義。CREATE SQL_BLOCK_RULE test_rule3 PROPERTIES ( "sql" = "select count\\(1\\) from test_db.test_table" ); CREATE SQL_BLOCK_RULE test_rule4 PROPERTIES ( "sql" = "select \\* from db1.tbl1" );
查看攔截規則
查看已配置的SQL阻止規則,不指定規則名則為查看所有規則。
語法
SHOW SQL_BLOCK_RULE [FOR RULE_NAME];
參數說明
參數名稱 | 必填 | 參數說明 |
rule_name | 否 | 規則名稱。 |
使用示例
查看所有規則,示例如下。
SHOW SQL_BLOCK_RULE; +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ | Name | Sql | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable | +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ | test_rule | select * from order_analysis | NULL | 0 | 0 | 0 | true | true | | test_rule2 | NULL | NULL | 30 | 0 | 10000000000 | false | true | +------------+------------------------+---------+--------------+-----------+-------------+--------+--------+ 2 rows in set (0.01 sec)
指定規則名查詢,示例如下。
SHOW SQL_BLOCK_RULE FOR test_rule2; +------------+------+---------+--------------+-----------+-------------+--------+--------+ | Name | Sql | SqlHash | PartitionNum | TabletNum | Cardinality | Global | Enable | +------------+------+---------+--------------+-----------+-------------+--------+--------+ | test_rule2 | NULL | NULL | 30 | 0 | 10000000000 | false | true | +------------+------+---------+--------------+-----------+-------------+--------+--------+ 1 row in set (0.00 sec)
修改攔截規則
修改SQL攔截規則,允許對規則的每一項屬性進行修改。
語法
ALTER SQL_BLOCK_RULE rule_name
[PROPERTIES ("key"="value", ...)];
參數說明
參數名稱 | 必填 | 參數說明 |
rule_name | 是 | 規則名稱。 |
PROPERTIES | 否 | 具體屬性,詳細說明請參見上文創建攔截規則。 |
使用示例
根據SQL屬性進行修改,示例如下。
ALTER SQL_BLOCK_RULE test_rule PROPERTIES("sql"="select \\* from test_table","enable"="true")
如果一個rule設置了partition_num,那么sql或者sqlHash將無法被修改,示例如下。
ALTER SQL_BLOCK_RULE test_rule2 PROPERTIES("partition_num" = "10","tablet_num"="300","enable"="true")
刪除攔截規則
刪除SQL阻止規則,支持同時刪除多條規則。
語法
DROP SQL_BLOCK_RULE test_rule1,...
參數說明
參數名稱 | 必填 | 參數說明 |
test_rule1 | 是 | 規則名稱。支持多規則,以“,”隔開。 |
使用示例
刪除test_rule1、test_rule2阻止規則,示例如下。
DROP SQL_BLOCK_RULE test_rule1,test_rule2;
Query OK, 0 rows affected (0.00 sec)
攔截規則綁定用戶
如果需要為指定數據庫賬號配置攔截規則,則需要設置規則的屬性global
為false,然后參考如下語句進行綁定,多個規則使用,
分隔。
SET PROPERTY [FOR 'jack'] 'sql_block_rules' = 'test_rule1,test_rule2';