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.