在金融、政务、医疗等行业,敏感数据(手机号、身份证、银行卡、客户地址)的合规治理已成为刚需。Oracle 从 12c 开始提供Data Redaction(数据脱敏 / 动态遮蔽),能在不改动原始数据的前提下,对查询结果做动态掩码,实现 “数据可用不可见”。
但在 23ai 之前,脱敏有明显短板:不支持复杂 SQL,分组、排序、聚合、关联查询一碰就报错或无法脱敏,严重限制在报表、BI、数据分析场景的落地。
Oracle 23ai(23.6)对数据脱敏做了架构级增强:脱敏从“作用于列” 升级为 “作用于结果集”,全面兼容复杂 SQL,真正做到业务透明、安全统一、性能可控.
23ai 把脱敏逻辑下沉到 SQL 执行结果集阶段:
原始数据不变,查询按真实值执行(索引、统计、优化器行为不变)结果返回前,对标记为敏感的列统一脱敏所有 SQL 结构,底层用真实值,外层返掩码值.
1)支持排序、分组、去重(GROUP BY / ORDER BY / DISTINCT)
-- 手机号脱敏:138****1234
EXEC DBMS_REDACT.ADD_POLICY(
object_schema => 'HR',
object_name => 'EMP',
column_name => 'PHONE',
policy_name => 'REDACT_PHONE',
function_type => DBMS_REDACT.FULL,
expression => '1=1'
);
-- 23ai 可正常执行:按脱敏列分组、排序
SELECT DEPT_ID, PHONE, COUNT(*)
FROM HR.EMP
GROUP BY DEPT_ID, PHONE
ORDER BY PHONE;
分组 / 排序:底层用真实 PHONE,返回给用户的是掩码值。
2)支持聚合函数(SUM/COUNT/MIN/MAX)
SELECT DEPT_ID, SUM(SALARY), AVG(SALARY)
FROM HR.EMP
GROUP BY DEPT_ID;
聚合计算用真实值,结果集中 SALARY 按策略脱敏。
3)支持集合运算(UNION/INTERSECT/MINUS)
SELECT EMP_ID, PHONE FROM HR.EMP
UNION
SELECT EMP_ID, PHONE FROM HR.EMP_HIS;
多表合并后,敏感列统一脱敏,不再出现 “部分明文、部分掩码”。
4)支持视图、表达式、WITH 子查询
CREATE OR REPLACE VIEW HR.EMP_V AS
SELECT EMP_ID, CONCAT('TEL:', PHONE) PHONE_TEL
FROM HR.EMP;
SELECT * FROM HR.EMP_V;
视图里的表达式列(含脱敏列)自动继承脱敏策略。
5)支持函数索引与扩展统计
-- 23ai 可在脱敏列上建函数索引、收集统计
CREATE INDEX IDX_EMP_PHONE ON HR.EMP(SUBSTR(PHONE,1,7));
EXEC DBMS_STATS.GATHER_TABLE_STATS('HR','EMP');
优化器成本估算正常,脱敏不影响执行计划与性能。