跳到主要内容

DBMS_UDR 概述

DBMS_UDR 系统包提供了改写绑定功能,可以在 SQL 开始执行之前根据匹配规则改写数据库接收到的 SQL 语句。目前支持对 SELECTINSERTREPLACEUPDATEDELETEMERGESET 语句类型进行改写。改写绑定规则可以通过视图 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删除一条自定义改写规则。