
# ALTER BLOCK RULE
#### 功能描述
修改查询过滤规则属性，包括查询过滤规则名称、绑定的客户端名称、客户端IP、用户以及匹配方式等。
在日常数据库操作中，异常SQL的执行可能会导致资源过度消耗，影响数据库性能和稳定性，通过创建查询过滤规则，可以将此类SQL语句进行拦截。
#### 注意事项
- 该语法仅9.1.0.100及以上集群版本支持。
- 只有拥有数据库所有者权限的用户或者授予gs_role_block角色权限的用户才能执行ALTER BLOCK RULE命令，系统管理员默认拥有此权限。
- 普通用户无法执行CREATE BLOCK RULE，可通过系统管理员进行授权，授权语法：
  ```
  GRANT gs_role_block TO user;
  ```
  建议**创建查询过滤规则时尽量缩小适用范围，避免误过滤，或者范围过大导致性能劣化**。
  
- DEFAULT语法用于对某一属性进行重置，但仅适用于非必选项。
 
#### 语法格式
```
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;
```
#### 参数说明
表1ALTER BLOCK RULE参数说明 
| 参数             | 描述                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          | 取值范围                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
|:---|:---|:---|
| block_name     | 需要修改属性的查询过滤规则名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | 字符串，需符合[标识符命名规范](https://support.huaweicloud.com/sqlreference-dws/dws_06_0007.html#ZH-CN_TOPIC_0000001811634529__section1475018612353)。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| TO             | 对查询过滤规则生效的对象或客户端IP，支持以下方式： - **TO user_name@'host'**：用户名以及客户端IP，两者都要满足，查询过滤规则才能生效。  - **TO user_name**：用户名，即只判定满足用户名条件，查询过滤规则就生效，不区分客户端IP。  - **TO 'host'**：客户端IP，即只判定满足客户端IP条件，查询过滤规则就生效，不区分用户。                                                                                                                                                                                                                       | 举例：查询过滤规则对来自客户端IP为192.168.0.59且登录用户名为user1时生效。 ``` ALTER BLOCK RULE query_block TO user1@'192.168.0.59' FOR SELECT  FILTER BY SQL('test.test'); ``` 查询过滤规则对登录用户名为user1时生效（无论客户端IP是哪个）。 ``` ALTER BLOCK RULE query_block TO user1 FOR SELECT  FILTER BY SQL('test.test'); ``` 查询过滤规则对来自客户端IP 192.168.0.59的访问时都生效（无论哪个用户登录）。 ``` 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查询，例如： ``` EXPLAIN VERBOSE SELECT * FROM test.test; ``` ![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002503156223.png "点击放大")                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
| with_parameter | 查询过滤规则选项参数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | - application_name，客户端名称。  - query_band，负载标识。  - table_num，语句扫描的基表个数。  - partition_num，算子预估扫描的最大分区数。  - estimate_row，算子预估扫描的最大表行数。  - resource_pool，需要切换到的资源池名称。  - max_active_num，规则对应语句的最大并发数。  - is_warning，控制拦截到语句的行为是告警还是报错，on表示告警，off为报错，默认为off。   |
   
#### 示例
创建查询规则query_block。
```
CREATE BLOCK RULE query_block FILTER BY SQL('update table_table set a=1');
```
创建一个测试用户。
```
DROP USER IF EXISTS user12 CASCADE;
CREATE USER user12 PASSWORD '{Password}';
```
修改查询规则query_block的属性。
```
ALTER BLOCK RULE query_block 
TO user12@'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**查询修改后的过滤规则。
```
SELECT * FROM pg_get_blockruledef('query_block');
```
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002567713529.png "点击放大")
对查询规则query_block进行重命名。
```
ALTER BLOCK RULE query_block RENAME TO query_block_new;
```
注意，修改规则时，如果只重设置了部分参数，则原来的其他参数还保留原值，**即设置哪个参数，只修改哪个参数，不是覆盖清空全部参数。**
```
ALTER BLOCK RULE query_block_new
TO user12@'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的取值修改，其他参数项仍存在。
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002536954446.png "点击放大")
同样，**新增过滤条件，也不会将之前的条件清除**，例如：
```
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_1');
```
返回结果显示：原来的application_name、query_band参数仍保留。
![](https://support.huaweicloud.com/sqlreference-dws/figure/zh-cn_image_0000002536834434.png "点击放大")
#### 相关链接
[CREATE BLOCK RULE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0292.html)，[DROP BLOCK RULE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0293.html)
