我们一般使用doris创建数仓之后,那么数仓里面存储的数据就会非常多。如果生产环境的数据没有太多备份或者备份还原代价很大的时候,那么我们就会要求各研发不允许做一些删除操作。
想象一下如果我们只是要求大家不能这么做,但是实际中会不会存在有人可能疏忽掉操作了删除。这种概率是存在的,因此我们不能只相信规则,因为具体执行的还是人在操作,所以我们有没有办法进行严格的限制呢,这里就说到今天介绍的sql拦截。
在doris中提供了sql拦截功能,及我们命名一组规则,然后当用户在doris上执行sql的时候命中了规则,那么doris就不会执行,而是给用户返回错误信息。下面我们先演示一下看下情况,再做详细的介绍。
一、创建表,并且增加数据
在doris中我们已经有前面的测试表和数据了,就是这个costs表,数据如下:
二、创建拦截规则
CREATE SQL_BLOCK_RULE costs_rule_2 PROPERTIES( "sql"="select \\* from costs", "global"="true", "enable"="true" )
三、执行下查询
select * from costs;
可以看到提示:
errCode = 2, detailMessage = sql match regex sql block rule: costs_rule_2
说明这条sql被拦截了,不能被doris执行。
从上面的现象可以看出doris提供的sql拦截功能还是非常强大的。
在doris中,sql的拦截规则配置主要有以下几个比较重要的参数
序号 | 属性值 | 说明 |
1 | sql | 匹配规则(基于正则匹配,特殊字符需要转译),可选,默认值为 "NULL" |
2 | sqlHash | sql hash值,用于完全匹配,我们会在fe.audit.log 打印这个值,可选,这个参数和sql只能二选一,默认值为 "NULL" |
3 | partition_num | 一个扫描节点会扫描的最大partition数量,默认值为0L |
4 | tablet_num | 一个扫描节点会扫描的最大tablet数量,默认值为0L |
5 | cardinality | 一个扫描节点粗略的扫描行数,默认值为0L |
6 | global | 是否全局(所有用户)生效,默认为false |
7 | enable | 是否开启阻止规则,默认为true |
我们可以根据当前的属性值配置规则限制。
下面再距离,例如我们限制所有的表的扫描行数不能超过3行
CREATE SQL_BLOCK_RULE costs_rule_3 PROPERTIES( "global"="true", "enable"="true", "cardinality"="3" )
使用上面的sql创建一条限制扫描超过3行数据,那么我们再查询下test_hll表
select * from test_hll;
可以看到返回了错误信息:
sql hits sql block rule: costs_rule_3, reach cardinality : 3
也就是当前表的行数超过了3行,所以查询这张表将不会返回数据。
备注:
1、如果在properties里面设置global=true的话,那么当前规则会被所有用户生效,如果设置为false的话,则需要为当前规则配置指定用户,例如:
SET PROPERTY FOR 'root' 'sql_block_rules' = 'costs_rule_1'
这里就相当于创建一个cost_rule_1的规则,然后适用于root用户。如果是多规则或者多用户的话,直接逗号分割即可,例如:
SET PROPERTY FOR 'root' 'sql_block_rules' = 'costs_rule_1,costs_rule_2'
还没有评论,来说两句吧...