در زمان انتقال اطلاعات از یک بانک عملیاتی به یک بانک تستی، ممکن است نیاز باشد تا اطلاعات حساس به طور شفاف به بانک مقصد منتقل نشوند در این صورت اگر از data pump برای جابجایی دیتا استفاده می کنیم، می توانیم در زمان برگرداندن دیتا با دستور impdp، داده های حساس را دستکاری کنیم. این کار، از طریق پارامتر REMAP_DATA و یک function(که از قبل در بانک تستی موجود است)، قابل انجام خواهد بود.
REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function
در ادامه قصد داریم جدولی که یکی از فیلدهای ان شامل کدملی می باشد، را با کمک Data Pump، از بانکی به بانک دیگر منتقل کنیم به طوریکه کدملی افراد در بانک مقصد، به صورت تصادفی پر شده باشند:
–in prod DB:
SQL> create table usef.person(id number,national_id number(10),name varchar2(9));
Table created.
SQL> insert into usef.person values(1,2064150841,’USEF’);
1 row created.
SQL> commit;
Commit complete.
[oracle@myhost ~]$ expdp dumpfile=mydump directory=frm tables=usef.person
Processing object type TABLE_EXPORT/TABLE/TABLE
. . exported “USEF”.”PERSON” 5.953 KB 1 rows
Job “SYS”.”SYS_EXPORT_TABLE_01″ successfully completed at Wed Nov 14 10:57:59 2018 elapsed 0 00:00:30
قبل از import کردن اطلاعات در بانک تستی، تابعی را در این بانک ایجاد می کنیم که کدملی را به عنوان ورودی دریافت کرده و عدد تصادفی ای را برمیگرداند:
–in test DB:
SQL>create or replace package usef.mypkg as
function myfunc(national_id number) return number;
end;
/
SQL>create or replace package body usef.mypkg as
function myfunc(national_id number) return number as
begin
return translate(national_id, 1234567890, 1111111111);
end;
end;
/
همانطور که می بینید، قرار است تابع myfun، کدملی را دریافت کند و در خروجی عدد 1 را برگرداند.
با دستور زیر، با کمک تابع myfunc، جدول person را در بانک مقصد(تست) برمیگردانیم به طوریکه کدملی افراد با عدد یک پر شده باشند:
[oracle@myhost ~]$ impdp dumpfile=mydump directory=frm tables=usef.person remap_data=usef.person.national_id:usef.mypkg.myfunc
Processing object type TABLE_EXPORT/TABLE/TABLE_DATA
. . imported “USEF”.”PERSON” 5.953 KB 1 rows
Job “SYS”.”SYS_IMPORT_TABLE_01″ successfully completed at Wed Nov 14 12:25:03 2018 elapsed 0 00:00:25
حال با رجوع به جدول person، خواهیم دید که کدملی ثبت شده، به عدد دیگری تبدیل شده است:
select * from usef.person;