数据库管理-第267期 23ai:Oracle Data Redaction演示(20241128)
作者:胖头鱼的鱼缸(尹海文) Oracle ACE Pro: Database(Oracle与MySQL) PostgreSQL ACE Partner 10年数据库行业经验,现主要从事数据库服务工作 拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证 墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,数盟会长老会成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问 圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著 名社恐(社交恐怖分子) 公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。 除授权转载并标明出处外,均为“非法”抄袭
在第256期对Oracle数据编校进行了介绍,本期对常见的数据脱敏展示场景进行演示。本次演示使用版本为23ai Free(RPM安装):

1 示例表及数据
针对姓名和电话号码进行脱敏展示。
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.AL32UTF8" sqlplus / as sysdba
alter session set container=pdbprod1; create user odr identified by odr; grant dba to odr; alter user odr default tablespace users quota unlimited on users; conn odr/odr@127.0.0.1:1521/pdbprod1 drop table if exists customers; create table customers (id number primary key,name varchar2(40),phonenumber number(13,0)); insert into customers values(1,'尹海文',13012345678); insert into customers values(2,'胖头鱼',13023456789); commit;

2 创建编校策略
2.1 名字全编校
conn / as sysdba alter session set container=pdbprod1; BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'odr', object_name => 'customers', column_name => 'name', policy_name => 'odr_customers_name_pol', function_type => DBMS_REDACT.FULL, expression => '1=1'); END; / select * from odr.customers; conn odr/odr@127.0.0.1:1521/pdbprod1 select * from customers;
这里可以看到在sys用户下,查询内容展示依然是未被编校的,而使用本用户则是内容展示已被编校,经测试拥有dba权限的用户不受编校策略影响。
2.2 电话部分编校
conn / as sysdba alter session set container=pdbprod1; BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'odr', object_name => 'customers', column_name => 'phonenumber', policy_name => 'odr_customers_phonenumber_pol', function_type => DBMS_REDACT.PARTIAL, expression => '1=1', function_parameters => '0,4,8'); END; /
在创建过程中发现该对象已经存在编校策略,因此需要删除原策略。
BEGIN DBMS_REDACT.drop_policy( object_name => 'customers', object_schema => 'odr', policy_name => 'odr_customers_name_pol' ); END; / BEGIN DBMS_REDACT.ADD_POLICY( object_schema => 'odr', object_name => 'customers', column_name => 'phonenumber', policy_name => 'odr_customers_phonenumber_pol', function_type => DBMS_REDACT.PARTIAL, expression => '1=1', function_parameters => '0,4,8'); END; / conn odr/odr@127.0.0.1:1521/pdbprod1 select * from customers;
由本测试也可以得出,Oracle数据编校策略的限制之一,就是一个对象只允许存在一个编校策略,目前我认为这限制了数据编校的使用场景。
3 DML演示
3.1 场景1
这里做一个数据使用数据编校后展示数据更新原数据的操作演示。
conn odr/odr@127.0.0.1:1521/pdbprod1 update customers set phonenumber=phonenumber where id=1; commit; conn / as sysdba alter session set container=pdbprod1; select * from odr.customers;
这种情况下对原数据无影响。
3.2 场景2
这里尝试用编校后查询结果更新已有数据。
conn odr/odr@127.0.0.1:1521/pdbprod1 update customers set phonenumber=(select phonenumber from customers where id=2) where id=1;
这里因为使用编校后数据,会提示权限不足,无法操作。经过测试拥有dba权限的用户因为不受编校策略影响也不会使用编校后的展示数据来更新已有数据。
由此可以看到当前版本以及本次操作的权限控制下,在有数据编校后的对象进行DML操作时,是不会因为数据编校后展示结果的改变而错误修改数据的。
总结
本期对Oracle Data Redaction的实际使用效果进行了展示。 老规矩,知道写了些啥。
