You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle如何实现数据脱敏 仅保留字段末尾3位其余用*掩码

Oracle 实现字段保留最后3位脱敏的方案

Oracle 内置了两类能力可直接实现「仅保留字段最后3位有效字符、其余替换为掩码」的需求,无需依赖第三方组件:

  • 全版本通用:通过原生字符串函数组合实现,适配所有Oracle版本,灵活度高,适合自定义查询场景
  • 12c及以上版本专属:内置DBMS_REDACT原生数据脱敏包,可配置环境级自动脱敏规则,配置后无需修改业务查询语句,指定账号查询时自动返回脱敏结果

方法一:字符串函数组合实现(全版本兼容)

核心逻辑无需调用特殊包,仅用3个基础内置函数即可完成:

  1. 用LENGTH()计算字段总长度,若字段长度≤3则直接返回原值,避免短姓名这类短字段被全量掩码
  2. 若字段长度>3,用RPAD()生成和「字段长度-3」数量一致的掩码字符(可按需替换为*、x等任意掩码字符)
  3. 用SUBSTR(字段名, -3)截取字段最后3位有效值,和前面生成的掩码字符串拼接即可

测试用表结构与初始数据:

create table customer (last_name varchar2(25), first_name varchar2(25), address varchar2(25));
insert into customer values('Doe', 'John', '10 someroad st');

对应脱敏查询语句(掩码字符使用*,需要换成x直接替换即可):

select 
  case when length(last_name) <= 3 then last_name
       else rpad('*', length(last_name) - 3, '*') || substr(last_name, -3)
  end as last_name,
  case when length(first_name) <= 3 then first_name
       else rpad('*', length(first_name) - 3, '*') || substr(first_name, -3)
  end as first_name,
  case when length(address) <= 3 then address
       else rpad('*', length(address) - 3, '*') || substr(address, -3)
  end as address
from customer;

如果需要调整脱敏规则,比如保留前N位、保留前后固定位数中间掩码,只需要调整SUBSTR的截取逻辑、掩码生成长度即可,适配性很强。

方法二:12c+版本内置Data Redaction自动脱敏

如果开发环境需要长期使用固定脱敏规则,不想每次写查询都手动加脱敏逻辑,可以直接用Oracle 12c开始自带的DBMS_REDACT内置包配置脱敏策略:配置完成后,仅指定账号(比如开发账号)查询表时会自动返回脱敏后的数据,管理员账号查询仍返回原始数据,业务侧的查询语句不需要做任何修改。
配置示例(仅DEV_USER开发账号查询时生效,所有字段保留最后3位,其余替换为*):

BEGIN
 DBMS_REDACT.ADD_POLICY(
   object_schema    => 'CUSTOMER表所属的schema名称',
   object_name      => 'CUSTOMER',
   policy_name      => 'CUST_DEV_MASK_POLICY',
   expression       => 'SYS_CONTEXT(''USERENV'',''SESSION_USER'') = ''DEV_USER''',
   column_name      => 'LAST_NAME',
   function_type    => DBMS_REDACT.PARTIAL,
   function_parameters => '*,1,0,0,3'
 );
END;
/
-- 按照相同规则给FIRST_NAME、ADDRESS字段追加脱敏配置即可

内容的提问来源于stack exchange,提问作者Ramiz Tariq

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 18:06:27