Oracle创建Redact Policy报DBMS_REDACT标识符未声明错误
Oracle DBMS_REDACT创建脱敏策略报PLS-00201排查方案
问题背景
需要在Oracle数据库中创建Redact Policy(数据脱敏策略),实现对所有用户隐藏RETAILX模式下CUSTOMER表的NIC字段,初始编写的PL/SQL创建代码如下:
BEGIN DBMS_REDACT.ADD_POLICY ( object_schema => 'RETAILX', object_name => 'CUSTOMER', column_name => 'NIC', policy_name => 'REDACT_NIC_POLICY', function_type => DBMS_REDACT.PARTIAL, function_parameters => 'MDy1', expression => '1=1' ); END; /
执行上述代码时系统抛出编译错误。
具体报错信息
ORA-06550: line 7, column 27: PLS-00201: identifier 'DBMS_REDACT' must be declared ORA-06550: line 2, column 2: PL/SQL: Statement ignored 06550. 00000 - "line %s, column %s:\n%s" *Cause: Usually a PL/SQL compilation error. *Action:
报错根因
- 版本适配问题:Oracle Data Redaction是12c版本才正式推出的原生特性,11g及更早版本数据库中不存在
DBMS_REDACT系统包,执行相关代码必然报标识符不存在错误。 - 权限缺失问题:即使用12c及以上版本,
DBMS_REDACT属于SYS用户下的系统包,默认不会给普通用户甚至DBA角色授予执行权限,当前执行脚本的用户没有该包的EXECUTE权限时,PL/SQL编译阶段就无法识别该标识符。 - 隐含参数问题:当前代码中
function_parameters参数值MDy1是日期类型字段的脱敏格式参数,NIC(身份证号/网络账号类字段)通常为字符串类型,即使解决包识别问题,后续执行策略也会抛出字段类型不匹配错误。
修复步骤
- 版本校验:用高权限用户执行
SELECT BANNER FROM v$version;确认数据库版本,若为11g及更早版本,需升级数据库或使用第三方脱敏方案,无法使用原生Redact能力。 - 权限授予:使用SYS用户或具备SYSDBA权限的账号登录,执行以下命令给创建策略的用户授予必要权限:
-- 替换成你实际执行创建策略的用户名 GRANT EXECUTE ON SYS.DBMS_REDACT TO YOUR_USER_NAME; -- 如需管理全库脱敏策略,可额外授予权限 GRANT EXECUTE_CATALOG_ROLE TO YOUR_USER_NAME;
- 参数修正:根据
NIC字段实际类型调整脱敏参数,若为字符串类型的身份证号,可参考如下参数配置实现保留前1位、后1位,中间全部脱敏为*的效果:
function_parameters => 'VVVVVVVVVVVVVVVVVVVV,*,1,16',
- 切换回原业务用户,重新执行策略创建脚本即可完成配置。
内容的提问来源于stack exchange,提问作者Havishka
相关产品推荐
相关产品推荐

