dba能否被真正限制访问业务表,取决于realm显式添加对象、启用、授权及回收exempt access policy权限四者缺一不可;否则所有配置均无效。

DBA 能否被真正限制访问业务表,取决于 Realm 是否显式添加对象、是否启用、是否有授权,以及 EXEMPT ACCESS POLICY 权限是否已被回收——缺一不可。只建 Realm 不加表,或忘了 ENABLED = 'Y',等于没设防。
Realm 必须手动添加对象并启用
默认 Realm 不保护任何对象,哪怕你创建了 'HR Realm',scott.emp 也不会自动受保护。必须执行:
BEGIN
dvsys.dbms_macadmin.add_object_to_realm(
realm_name => 'HR Realm',
object_owner => 'SCOTT',
object_name => 'EMP',
object_type => 'TABLE'
);
END;
/
之后查 dba_dv_realm 确认状态是 ENABLED,不是 DISABLED 或 CREATED;查 dba_dv_realm_object 确认对象已注册成功。
- 常见错误:只运行
create_realm,没调add_object_to_realm - 隐式访问始终关闭——即使表所有者
SCOTT也不自动有权限,必须显式授权 - 对象类型要写对:
'TABLE'、'VIEW'、'PROCEDURE',大小写不敏感但建议全大写
所有者和参与者都需显式授权
Realm 下没有“所有者天然可读”的逻辑。SCOTT 想查自己 EMP 表,也得走授权流程:
BEGIN
dvsys.dbms_macadmin.add_auth_to_realm(
realm_name => 'HR Realm',
grantee => 'SCOTT',
auth_options => 1 -- 1 = Owner, 2 = Participant
);
END;
/
如果不加这步,SCOTT 登录后执行 SELECT * FROM emp 也会报 ORA-47418: Realm violation for object SCOTT.EMP。
-
auth_options => 1授予所有者权限(仅限该对象所有者) -
auth_options => 2授予参与者权限(适用于应用用户,如APP_USER) - 授权后必须
COMMIT,否则不生效 - 授权可绑定 Rule Set(如只在工作时间生效),见下一条
授权规则集(Rule Set)决定权限何时生效
Realm 授权本身不带条件,但绑定的 Rule Set 可以控制“什么时候允许访问”。例如,你想让 SCOTT 只能在工作日 9–17 点查 EMP:
BEGIN
dvsys.dbms_macadmin.create_rule_set(
rule_set_name => 'Workday Only',
description => 'Allow access only on weekdays 9AM–5PM',
enabled => 'Y'
);
dvsys.dbms_macadmin.add_rule_to_rule_set(
rule_set_name => 'Workday Only',
rule_name => 'Is Workday and Business Hours',
rule_expr => 'dvsys.dbms_macutl.is_daytime AND dvsys.dbms_macutl.is_weekday'
);
dvsys.dbms_macadmin.compile_rule_set('Workday Only');
END;
/
然后把该 Rule Set 绑定到 Realm 授权上(用 DVA Web 界面或 alter_auth_to_realm 修改)。
- Rule Set 默认返回
TRUE,一旦自定义就需主动编译:dvsys.dbms_macadmin.compile_rule_set - 查当前状态用
dvsys.dbms_macadmin.get_rule_set_status,别只看 DVA 界面显示“Enabled”就以为生效了 - Rule Set 可复用:同一个 Rule Set 可同时用于多个 Realm 授权或 Command Rule
必须回收 EXEMPT ACCESS POLICY 权限
这是最容易被忽略、也最致命的一环。SYS、SYSTEM 默认拥有 EXEMPT ACCESS POLICY,该权限可绕过所有 Realm 和 Command Rule。不回收,前面所有配置都形同虚设。
回收方式(需在 dvsys 用户下执行):
REVOKE EXEMPT ACCESS POLICY FROM SYS; REVOKE EXEMPT ACCESS POLICY FROM SYSTEM;
注意:回收后,SYS 连 SELECT * FROM scott.emp 都会触发 ORA-47418;但 DBA 仍可通过其他路径绕过(如 OS 认证 + ORACLE_HOME 下直接启动实例),所以还需检查 os_authent_prefix 和密码文件配置。
- 回收前务必确认已有应急方案(如保留一个带 DV 管理权限的非-SYS 账户)
- 回收后,
ALTER SYSTEM、FLASHBACK DATABASE等高危命令若未配 Command Rule,默认仍允许——这意味着你要单独管控这些操作 - RAC 环境中,每个实例都要单独回收,不能只在一个节点执行
真正起作用的从来不是“建了 Realm”,而是对象是否在 dba_dv_realm_object 里、授权是否在 dba_dv_realm_auth 里、Rule Set 是否 COMPILE 成功、以及 EXEMPT ACCESS POLICY 是否真的没了——四者缺一,DBA 就还在自由通行。











