Introduction

Il est parfois souhaitable lors d'un export par DataPump de modifier certaines données dites confidentielles. Un bon exemple est un numéro de carte bancaire ou de sécurité sociale. Ce billet présente l'option remap_data de la commande expdp qui permet cette transformation.

La syntaxe pour utiliser remap_data est la suivante :

remap_data=schema.table.colonne:schema.package.fonction

Mise en place

Dans un premier temps créer deux utilisateurs sur la base Oracle avec les droits ad hoc.

-- On utilise la gestion OMF
create tablespace data_test;
-- Objet directory pour datapump
create directory dpump as '/home/oracle/dpump';
-- Utilisateurs
create user alice identified by ecila default tablespace data_test quota unlimited on data_test;
grant connect, resource to alice;
grant read, write on directory dpump to alice;
create user bob identified by robert default tablespace data_test quota unlimited on data_test;
grant connect resource to bob;
grant read, write on directory dpump to bob;

Se connecter alice sur la base

-- Connexion alice
connect alice/ecila
create table t1 ( code number, cb number );
insert into t1 values (1,123456);
insert into t1 values (2,789012);
insert into t1 values (3,345678);
commit;
-- Creation de la fonction de transformation
create or replace package transform as
  function trans_cb ( cb in number) return number;
end;
/
create or replace package body transform as
  function trans_cb ( cb in number) return number as changed_value number;
begin
  changed_value := round(dbms_random.value(100000,999999));
  return changed_value;
end;
/

Il est possible de tester la transformation ainsi :

select transform.trans_cb(123456) from dual;
658794

Lancement de l'export datapump

expdp alice/ecila directory=dpump dumpfile=t1.dpump logfile=t1.dpimp.log tables=alice.t1 remap_data=alice.t1.cb:alice.transform.trans_cb

Puis procéder à l'import datapump dans le schéma de Bob.

 impdp bob/robert directory=dpump dumpfile=test.dpump logfile=test.dpimp.log remap_schema=alice:bob table_exists_action=replace

Se connecter à la base pour vérifier

select * from alice.t1;

      CODE         CB
---------- ----------
         1     123456
         2     789012
         3     345678

select * from bob.t1;

      CODE         CB
---------- ----------
         1     461025
         2     638644
         3     462037

Les données ont bien été modifiées.

Conclusion

La fonction de transformation présentée est simple et facilement adaptable.