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 |
|---|