ALTER BLOCK RULE
功能描述
修改查询过滤规则属性,包括查询过滤规则名称、绑定的客户端名称、客户端IP、用户以及匹配方式等。
在日常数据库操作中,异常SQL的执行可能会导致资源过度消耗,影响数据库性能和稳定性,通过创建查询过滤规则,可以将此类SQL语句进行拦截。
注意事项
- 该语法仅9.1.0.100及以上集群版本支持。
- 只有拥有数据库所有者权限的用户或者授予gs_role_block角色权限的用户才能执行ALTER BLOCK RULE命令,系统管理员默认拥有此权限。
- 普通用户无法执行CREATE BLOCK RULE,可通过系统管理员进行授权,授权语法:
1GRANT 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; |
参数说明
|
参数 |
描述 |
取值范围 |
||||||
|---|---|---|---|---|---|---|---|---|
|
block_name |
需要修改属性的查询过滤规则名称。 |
字符串,需符合标识符命名规范。 |
||||||
|
TO |
对查询过滤规则生效的对象或客户端IP,支持以下方式:
|
举例:查询过滤规则对来自客户端IP为192.168.0.59且登录用户名为user1时生效。
查询过滤规则对登录用户名为user1时生效(无论客户端IP是哪个)。
查询过滤规则对来自客户端IP 192.168.0.59的访问时都生效(无论哪个用户登录)。
|
||||||
|
FOR |
语句类型,支持对UPDATE/SELECT/INSERT/DELETE/MERGE INTO五种类型语句进行限制。 |
- |
||||||
|
FILTER BY |
过滤方法,支持两种形式:
|
unique_sql_id和sql_hash取值,可以通过EXPLAIN VERBOSE查询,例如:
|
||||||
|
with_parameter |
查询过滤规则选项参数。 |
|
示例
创建查询规则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参数仍保留。

