VPD策略函数必须返回VARCHAR2类型的合法WHERE条件字符串需先创建应用上下文并赋值否则过滤失效sec_relevant_cols参数启用列级掩码12cobject_type应为TABLE且object_schema须写真实属主。VPD 策略函数必须返回 VARCHAR2 类型的 WHERE 条件字符串oracle 的 dbms_rls 包依赖策略函数动态拼接 sql 过滤条件这个函数不能返回布尔值、数字或 null —— 必须是合法的 sql 片段如 dept_id sys_context(hr_ctx, dept_id)且最终会被拼进查询的 where 子句里。返回空字符串或仅空格会导致全表可见返回无效语法比如漏引号、多逗号则在首次访问时抛 ora-28113: policy predicate has error。策略函数里避免用 SELECT ... INTO 查询用户属性优先用 SYS_CONTEXT 获取应用上下文减少解析开销不要在策略函数中调用 PL/SQL 包过程或写日志——它可能被反复执行影响性能测试时用 EXPLAIN PLAN 查看实际执行计划确认 VPD 条件是否被下推到基表扫描层添加策略前必须先创建应用上下文并赋值VPD 本身不管理用户身份它只读取上下文CONTEXT。如果你跳过这步策略函数里调用 SYS_CONTEXT(HR_CTX, dept_id) 永远返回 NULL结果就是过滤条件失效用户看到全部数据。先执行 CREATE CONTEXT HR_CTX USING hr.ctx_pkg;再创建包 hr.ctx_pkg 提供 set_dept 过程应用登录后必须显式调用 hr.ctx_pkg.set_dept(10)否则上下文为空 —— Web 应用常在这里漏掉初始化上下文名称如 HR_CTX区分大小写策略函数里写的名称必须完全一致否则静默失败DBMS_RLS.ADD_POLICY 的 sec_relevant_cols 参数会触发 FGA 式列级过滤当设置 sec_relevant_cols SALARY,SSNOracle 不仅做行过滤还会对指定列自动加掩码非授权用户查出来是 NULL即使策略函数没限制行。这不是 VPD 默认行为而是开启“列级敏感控制”的开关且要求 policy_function 返回的条件中不能包含这些列的显式过滤逻辑否则冲突。该参数启用后SELECT * 和 SELECT SALARY 都会把 SALARY 返回为 NULL除非用户在策略中被明确授权访问和普通 VPD 策略不同这种模式下无法用 UPDATE 绕过 —— 列值在查询层就被截断了注意兼容性sec_relevant_cols 在 Oracle 12c 及以后才支持完整列掩码11g 只能配合 sec_relevant_cols_opt 做简单隐藏策略作用范围容易误配对象类型选错导致策略不生效object_type 参数不是指表名类型而是指策略挂载的目标对象种类。填 TABLE 行得通但填 VIEW 或 SYNONYM 就可能失效 —— 因为 VPD 策略只绑定到基表base table视图或同义词上加策略不会自动透传。 通义听悟 阿里云通义听悟是聚焦音视频内容的工作学习AI助手依托大模型帮助用户记录、整理和分析音视频内容体验用大模型做音视频笔记、整理会议记录。