该功能用于限制执行 SQL 语句(DDL / DML 都可限制)。
支持按用户配置 SQL 的拦截规则,如使用正则表达式匹配和拦截 SQL,或使用支持的规则进行拦截。
创建和管理规则
创建规则
更多创建语法请参阅CREATE SQL BLOCK RULE
sql:匹配规则 (基于正则匹配,特殊字符需要转译),可选,默认值为 “NULL”sqlHash: sql hash 值,用于完全匹配,我们会在fe.audit.log打印这个值,可选,这个参数和 SQL 只能二选一,默认值为 “NULL”partition_num: 一个扫描节点会扫描的最大 Partition 数量,默认值为 0Ltablet_num: 一个扫描节点会扫描的最大 Tablet 数量,默认值为 0L。cardinality: 一个扫描节点粗略的扫描行数,默认值为 0Lglobal:是否全局 (所有用户) 生效,默认为 falseenable:是否开启阻止规则,默认为 true
示例:
1. CREATE SQL_BLOCK_RULE test_rule1
2. PROPERTIES(
3. "sql"="select \\* from order_analysis",
4. "global"="false",
5. "enable"="true",
6. "sqlHash"=""
7. );
9. CREATE SQL_BLOCK_RULE test_rule2
10. PROPERTIES(
11. "partition_num" = "30",
12. "cardinality"="10000000000",
13. "global"="false",
14. "enable"="true"
15. )
备注
注意:这里 SQL 语句最后不要带分号
从 2.1.6 版本开始,SQL 拦截规则支持外部表(External Catalog 中的表)。
sql:和内表含义一致。sqlHash: 和内表含义一致。partition_num:和内表含义一致。tablet_num:限制外表的扫描的分片数量。不同的数据源,分片的定义不尽相同。比如 Hive 表中的文件分片,Hudi 表中的增量数据分片等。cardinality:和内表含义一致,限制扫描行数。只有当外表存在行数统计信息时(如通过手动或自动统计信息采集后),该参数才会生效。
绑定规则
global 为 true 的规则是全局生效的,不需要绑定到具体用户。
global 为 false 的规则,需要绑定到指定用户。一个用户可以绑定多个规则,多个规则使用 , 分隔:
1. SET PROPERTY [FOR 'jack'] 'sql_block_rules' = 'test_rule1,test_rule2'
查看规则
- 查看已配置的 SQL 阻止规则
不指定规则名则为查看所有规则,具体语法请参阅 SHOW SQL BLOCK RULE
1. SHOW SQL_BLOCK_RULE [FOR RULE_NAME]
- 查看用户绑定的规则
1. SHOW PROPERTY FOR user_name;
修改规则
允许对 sql/sqlHash/partition_num/tablet_num/cardinality/global/enable 等每一项进行修改,具体语法请参阅ALTER SQL BLOCK RULE
sql和sqlHash不能同时被设置。
如果一个 rule 设置了 sql 或者 sqlHash,则另一个属性将无法被修改。
- sql/sqlHash 和 partition_num/tablet_num/cardinality 不能同时被设置
举例,如果一个 rule 设置了 partition_num,那么 sql 或者 sqlHash 将无法被修改。
1. ALTER SQL_BLOCK_RULE test_rule PROPERTIES("sql"="select \\* from test_table","enable"="true")
1. ALTER SQL_BLOCK_RULE test_rule2 PROPERTIES("partition_num" = "10","tablet_num"="300","enable"="true")
删除规则
支持同时删除多个规则,以 , 隔开,具体语法请参阅 DROP SQL BLOCK RULE
1. DROP SQL_BLOCK_RULE test_rule1,test_rule2
触发规则
当我们去执行刚才我们定义在规则里的 SQL 时就会返回异常错误,示例如下:
1. mysql> select * from order_analysis;
2. ERROR 1064 (HY000): errCode = 2, detailMessage = sql match regex sql block rule: order_analysis_rule
