更新时间:2025-11-03 GMT+08:00

ALTER BLOCK RULE

功能描述

修改查询过滤规则属性,包括查询过滤规则名称、绑定的客户端名称、客户端IP、用户以及匹配方式等。

在日常数据库操作中,异常SQL的执行可能会导致资源过度消耗,影响数据库性能和稳定性,通过创建查询过滤规则,可以将此类SQL语句进行拦截。

注意事项

  • 该语法仅9.1.0.100及以上集群版本支持。
  • 只有拥有数据库所有者权限的用户或者授予gs_role_block角色权限的用户才能执行ALTER BLOCK RULE命令,系统管理员默认拥有此权限。
  • 普通用户无法执行CREATE BLOCK RULE,可通过系统管理员进行授权,授权语法:
    1
    GRANT gs_role_block TO user;
    

    建议创建查询过滤规则时尽量缩小适用范围,避免误过滤,或者范围过大导致性能劣化

  • DEFAULT语法用于对某一属性进行重置,但仅适用于非必选项。

语法格式

1
2
3
4
5
6
7
ALTER BLOCK RULE block_name
    [ [ TO user_name@'host' ] | [ TO user_name ] | [ TO 'host' ] | [ TO DEFAULT ] ] |
    [ FOR UPDATE | SELECT | INSERT | DELETE | MERGE | DEFAULT ] |
    FILTER BY
    { SQL ( 'text' ) | TEMPLATE ( template_parameter = value ) }
    [ WITH ( { with_parameter = value }, [, ... ] ) ];
ALTER BLOCK RULE block_name RENAME to new_block_name;

参数说明

表1 ALTER BLOCK RULE参数说明

参数

描述

取值范围

block_name

需要修改属性的查询过滤规则名称。

字符串,需符合标识符命名规范

TO

对查询过滤规则生效的对象或客户端IP,支持以下方式:

  • TO user_name@'host':用户名以及客户端IP,两者都要满足,查询过滤规则才能生效。
  • TO user_name:用户名,即只判定满足用户名条件,查询过滤规则就生效,不区分客户端IP。
  • TO 'host':客户端IP,即只判定满足客户端IP条件,查询过滤规则就生效,不区分用户。

举例:查询过滤规则对来自客户端IP为192.168.0.59且登录用户名为user1时生效。

1
ALTER BLOCK RULE query_block TO user1@'192.168.0.59' FOR SELECT  FILTER BY SQL('test.test');     

查询过滤规则对登录用户名为user1时生效(无论客户端IP是哪个)。

1
ALTER BLOCK RULE query_block TO user1 FOR SELECT  FILTER BY SQL('test.test');  

查询过滤规则对来自客户端IP 192.168.0.59的访问时都生效(无论哪个用户登录)。

1
ALTER BLOCK RULE query_block TO '192.168.0.59' FOR SELECT  FILTER BY SQL('test.test');  

FOR

语句类型,支持对UPDATE/SELECT/INSERT/DELETE/MERGE INTO五种类型语句进行限制。

-

FILTER BY

过滤方法,支持两种形式:

  • SQL:根据SQL语句内容进行过滤,通过关键词对语句进行正则匹配,例如表名,其长度不能超过1024,建议尽量精简。
  • TEMPLATE:根据模板进行过滤,此方法不区分用户,针对所有用户执行的特定语句都实施拦截,拦截效果更高效,取值如下:
    • unique_sql_id:归一化的64位哈希值,重复概率较sql_hash大一些。
    • sql_hash:归一化的哈希值(md5),一般不会重复,相较unique_sql_id更推荐使用。

unique_sql_id和sql_hash取值,可以通过EXPLAIN VERBOSE查询,例如:

1
EXPLAIN VERBOSE SELECT * FROM test.test;

with_parameter

查询过滤规则选项参数。

  • application_name,客户端名称。
  • query_band,负载标识。
  • table_num,语句扫描的基表个数。
  • partition_num,算子预估扫描的最大分区数。
  • estimate_row,算子预估扫描的最大表行数。
  • resource_pool,需要切换到的资源池名称。
  • max_active_num,规则对应语句的最大并发数。
  • is_warning,控制拦截到语句的行为是告警还是报错,on表示告警,off为报错,默认为off。

示例

创建查询规则query_block。

1
CREATE BLOCK RULE query_block FILTER BY SQL('update table_table set a=1');

修改查询规则query_block的属性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ALTER BLOCK RULE query_block 
TO user1@'192.168.0.59' 
FOR SELECT 
FILTER BY 
SQL('select * from table_name') 
WITH (application_name='gsql',
query_band='test1',
table_num='2',
partition_num='3',
estimate_row='1000',
resource_pool='rsp1',
max_active_num='3',
is_warning='off'
);

通过视图pg_get_blockruledef查询修改后的过滤规则。

1
SELECT * FROM pg_get_blockruledef('query_block');

对查询规则query_block进行重命名。

1
ALTER BLOCK RULE query_block RENAME TO query_block_new;

注意,修改规则时,如果只重设置了部分参数,则原来的其他参数还保留原值,即设置哪个参数,只修改哪个参数,不是覆盖清空全部参数。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
ALTER BLOCK RULE query_block_new
TO user1@'192.168.0.59' 
FOR SELECT 
FILTER BY 
SQL('select * from table_name') 
WITH (
query_band='test2',
table_num='3');

SELECT * FROM pg_get_blockruledef('query_block_new');

从回显看出,只是将query_band、table_num的取值修改,其他参数项仍存在。

同样,新增过滤条件,也不会将之前的条件清除,例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
CREATE BLOCK RULE query_block_1 FILTER BY SQL('update table_table set a=1')
WITH (application_name='gsql',
query_band='test1');

ALTER BLOCK RULE query_block_1 FILTER BY SQL('update table_table set a=1')
WITH (
table_num='2',
partition_num='3',
estimate_row='1000',
resource_pool='rsp1',
max_active_num='3',
is_warning='off'
);
SELECT * FROM pg_get_blockruledef('query_block');

从回显看出,原来的application_name、query_band参数仍保留。