DBMS_UDR 概述
DBMS_UDR 系统包提供了改写绑定功能,可以在 SQL 开始执行之前根据匹配规则改写数据库接收到的 SQL 语句。目前支持对 SELECT、INSERT、REPLACE、UPDATE、DELETE、MERGE、SET 语句类型进行改写。改写绑定规则可以通过视图 DBA_OB_USER_DEFINED_RULES 进行查询。
配置项 enable_user_defined_rewrite_rules 用于控制是否开启改写绑定功能,默认关闭。如果改写绑定功能已开启,它会根据用户自定义的改写规则来检查是否对服务器收到的每个 SQL 语句进行改写。
ALTER SYSTEM SET enable_user_defined_rewrite_rules = 'True';
ALTER SYSTEM SET enable_user_defined_rewrite_rules = 'False';
改写绑定规则及匹配原理
改写绑定规 则及匹配原理如下:
- 使用跟 Prepared Statements 相同的语法来定义改写规则。
- 在改写规则模板中使用“?”或者“:{name}”充当匹配常量参数的标记。
- 常量参数标记不能用于 SQL 关键字、标识符、函数等。
- 对除了用“?”或者“:{name}”标记的参数之外的常量值,进行等值匹配。
- 同时存在多个可匹配规则时,随机匹配第一个匹配上的规则。
- 对创建规则时指定的数据库名称进行严格匹配。
如下示例中,在改写规则模板中使用“:{name}”充当匹配常量参数的标记。
CALL DBMS_UDR.CREATE_RULE('rule1',
'test',
'select :A + 1 from dual',
'select :A + 10, 20 from dual');
如下示例中,在改写规则模板中使用“?”充当匹配常量参数的标记。
CALL DBMS_UDR.CREATE_RULE('rule1',
'test',
'select ? + 1 from dual',
'select ? + 10, 20 from dual');
下表展示了 SELECT 语句示例与上述改写规则是否匹配。
| SQL | 是否能命中规则 |
|---|---|
| select 1 + 1 from dual | 是 |
| select ? + 1 from dual | 是 |
| select 1 + 2 from dual | 否 |
| select 1 + ? from dual | 否 |
权限说明
通过配置项 enable_user_defined_rewrite_rules 控制是否开启改写绑定功能,创建规则时会指定 Database 来控制权限。
DBMS_UDR 子程序概览
下表列出了 seekdb 所支持的 DBMS_UDR 子程序和简要描述。
| 子程序 | 描述 |
|---|---|
| CREATE_RULE | 创建一条自定义改写规则。 |
| DISABLE_RULE | 关闭一条自定义改写规则。 |
| ENABLE_RULE | 开启一条自定义改写规则。 |
| REMOVE_RULE | 删除一条自定义改写规则。 |