مدتی میگذره که از من درخواست کرده بودند دیتای برخی جداول رو Mask کنم. تو بین سولوشن‌های اوراکل ۲ تا سولوشن نظر من رو به خودش جلب کرد.

سولوشن اول

استفاده از OEM

توجه کنید شما برای استفاده از این سولوشن نیازمند تهیه لایسنس OEM به صورت جداگانه هستید. توی داکیومنتی که در پایین اشاره کردم اوراکل به صورت کامل این قابلیت OEM رو به همراه مثال توضیح داده همچنین شما می‌تونید از بخش subsetting گذر کنید.

https://docs.oracle.com/database/121/DMKSB/intro.htm#DMKSB-GUID-24B241AF-F77F-46ED-BEAE-3919BF1BBD80

سولوشن دوم

اسفاده از پارامتر کامندی REMAP_DATA در Oracle Data Pump

توی این مطلب به سولوشن دوم می‌پردازیم.

این ویژگی در کامند expdp به شما این امکان رو میده که یک remap فانکشن رو مشخص کنید که مقدار اصلی ستون تهیه شده رو به عنوان منبع ورودی فانکشن در نظر بگیره و مقدار remap شده از فانکشن رو باز گردونه و در فایل dump جایگذاری بکنه. یکی از استفاده‌های رایج از این ویژگی Mask کردن دیتا برای جا به جایی دیتا از یک سیستم عملیاتی به یک محیط توسعه است.

قدم اول ساخت remap فانکشن

من فانکشن زیر رو ایجاد کردم اگه اون رو بهتر کردید حتما ویرایش خودتون رو در کامنت‌ها برای من بفرستید تا اون رو اعمال کنم.

نکته: این فانکشن برای ۴ دیتا تایپ VARCHAR2, NUMBER, FLOAT, BLOB با در نظر گرفتن حروف فارسی نوشته شده. همچنین در دیتاتایپ BLOB صرفاً عملیات پاک سازی دیتا انجام میشه

https://gist.github.com/mghaffari94/53583fcbac03df98c8cb3bca24263e61

CREATE OR REPLACE PACKAGE C##MAHDI_GH.OBFUSCATING IS
     FUNCTION VAR(R IN VARCHAR2) RETURN VARCHAR2;
     FUNCTION NUM(R IN NUMBER) RETURN NUMBER;
     FUNCTION FLO(R IN FLOAT) RETURN FLOAT;
     FUNCTION CLEAR_BLOB(col blob) RETURN BLOB;
  END;
/
=======================================================
CREATE OR REPLACE PACKAGE BODY C##MAHDI_GH.OBFUSCATING
IS
    FUNCTION VAR (R IN VARCHAR2)
        RETURN VARCHAR2
    AS
    BEGIN
        RETURN (TRANSLATE (
                    R,
                    'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*()_+-=\/ابپتثجچحخدذرزژسشصضطظعغفقکگلمنوهی',
                    'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxضصثیسشبلفغاریبلفثقهتلیاستیذزلیفثهس'));
    END;


    FUNCTION NUM (R IN NUMBER)
        RETURN NUMBER
    AS
        S   NUMBER;
    BEGIN
        S := R * 2 / 1 + 10;

        RETURN (S);
    END;

    FUNCTION FLO (R IN FLOAT)
        RETURN FLOAT
    AS
        S   FLOAT;
    BEGIN
        S := R * 2 / 1 + 10;

        RETURN (S);
    END;

    FUNCTION CLEAR_BLOB (col IN BLOB)
        RETURN BLOB
    AS
        b1   BLOB := EMPTY_BLOB ();
    BEGIN
        RETURN b1;
    END clear_blob;
END;
/

قدم دوم

طبق داکیومنت اوراکل توی مرحله دوم باید به شکل زیر از این فانکشن‌ها برای remap دیتا استفاده کنید:

https://docs.oracle.com/database/121/SUTIL/GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9.htm#SUTIL861

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/sutil/oracle-data-pump-export-utility.html#GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9

REMAP_DATA=[schema.]tablename.column_name:[schema.]pkg.function


یک مثال طبق داکیومنت به این شکل هستش:

REMAP_DATA=HB.USER.FIRST_NAME:C##HB.OBFUSCATING.VAR

حالا شما می‌تونید از این پارامتر در ابزار expdp به شکلی که نیاز دارید استفاده کنید. ۲ روش کلی برای استفاده از پارامترها در expdp وجود داره.

روش اول

به شکل ۱ دستور واحد

[oracle@test par]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfile=OBFUSCATING_001.log schemas=HB REMAP_DATA=HB.USER.TITLE:C##HB.OBFUSCATING.VAR

روش دوم

استفاده از پارامتر فایل

[oracle@test par]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfile=OBFUSCATING_001.log schemas=test2 parfile=/home/oracle/par/01.par

همونطور که در syntax دستور در داکیومنت مشخص هستش شما باید اسم جدول با اسم ستون هر کدوم از ستونهایی که نیاز دارید Mask بشوند رو در دستور وارد کنید. اینجا اگه تعداد زیادی جدول با ستون داشته باشید ممکنه اذیت بشید.

من برای حل این مشکل یک dynamic query نوشتم که به جز ستون‌های مشخص شده که نباید Mask دیتا بر روی اونها انجام بشه باقی ستون‌ها دستورش نوشته بشه

select x from (select 'REMAP_DATA='||OWNER || '.' || table_name || '.' || COLUMN_NAME || ':C##MAHDI_GH.OBFUSCATING.VAR"' x from all_tab_columns 
where OWNER='HB'
and COLUMN_NAME not in ('ID', 'MOBILE_NUMBER', 'USERNAME', 'USER_ID', 'IS_VERIFIED_MOBILE')
and DATA_TYPE not in ('TIMESTAMP(6)', 'DATE', 'LONG')
and DATA_TYPE = 'VARCHAR2');

اما مشکلی که به اون برخوردم و برای من حل این مشکل بسیار جالب بود و خوشحالم از اینکه وقت این رو دارم با شما به اشتراک بذارم مشکل زیر بودش.

من تمام ستون هایی که میخواستم رو با داینامیک کویری درآوردم و به دستور expdp با روش اول یعنی به شکل یک دستور دادم.

شما می‌تونید به ۲ صورت زیر از این دستور استفاده کنید و اینجا فرقی نداره از کدوم روش استفاده کنید.

REMAP_DATA=HB.USER.TITLE:C##MAHDI_GH.OBFUSCATING.VAR, HB.KEY.NO:C##HB.OBFUSCATING.NUM
REMAP_DATA=HB.USER.TITLE:C##MAHDI_GH.OBFUSCATING.VAR REMAP_DATA=HB.KEY.NO:C##HB.OBFUSCATING.NUM

مساله ای که پیش میاد من بیش از ۱۵۰ ستون رو باید در یک خروجی data pump با هم mask کنم. وقتی این دستورات رو کنار هم بذارید مثلا با ابزاری مانند ++notepad و بخواهید اکسپورت رو اجرا کنید فقط تعداد محدودی از این ورودی ها مورد قبول دستور expdp میگردد. این به دلیل محدودیت ابزار expdp برای قبول ورودی از خط فرمان برای بیشتر از ۱۵۰۰ کاراکتره.

[oracle@test ~]$ expdp HB@pdb directory=backup dumpfile=HB_OBFUSCATING_001.dmp logfile=HB_OBFUSCATING_001.log schemas=HB remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR Export: Release 12.2.0.1.0 - Production on Sun Aug 23 18:55:44 2020Copyright (c) 1982, 2017, Oracle and/or its affiliates.  All rights reserved.Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit ProductionStarting "HB"."SYS_EXPORT_SCHEMA_01":  HB/********@ganjehpdb directory=backup dumpfile=HB_OBFUSCATING_001.dmp logfile=HB_OBFUSCATING_001.log schemas=HB remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR remap_data=HB.A.TITLE:HB.OBFUSCATING.VAR 
Processing object type SCHEMA_EXPORT/TABLE/TABLE_DATA
Processing object type SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS
Processing object type SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS
Processing object type SCHEMA_EXPORT/STATISTICS/MARKER
Processing object type SCHEMA_EXPORT/USER
Processing object type SCHEMA_EXPORT/SYSTEM_GRANT
Processing object type SCHEMA_EXPORT/DEFAULT_ROLE
Processing object type SCHEMA_EXPORT/TABLESPACE_QUOTA
Processing object type SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA
Processing object type SCHEMA_EXPORT/TABLE/TABLE
Processing object type SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN
Processing object type SCHEMA_EXPORT/PROCEDURE/PROCEDURE
Processing object type SCHEMA_EXPORT/PROCEDURE/ALTER_PROCEDURE
Processing object type SCHEMA_EXPORT/TABLE/INDEX/INDEX
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT
Processing object type SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT
. . exported "HB"."a"                        1.1 MB   1 rows
. . exported "HB"."b"                 1.1 MB   1 rows
. . exported "HB"."c"                  1.1 MB   1 rows
. . exported "HB"."e"                1.1 MB   1 rows
Master table "HB"."RT_SCHEMA_01" successfully loaded/unloaded
******************************************************************************
Dump file set for HB.SYS_EXPORT_SCHEMA_01 is:  /backup/HB_OBFUSCATING_001.dmpJob
"HB"."SYS_EXPORT_SCHEMA_01" successfully completed at Sun Aug 23 18:57:15 2020 elapsed 0 00:01:31

به دلیل وجود این محدودیت شما نمی‌تونید از این روش برای mask ستونهای زیاد در یک اکسپورت واحد استفاده کنید. (یک راه حلی که ممکنه در اینجا به ذهن بیاد اینه که از هر جدول به صورت مجزا export تهیه بشه و در نهایت با n تا export اینکار انجام بشه.)

برای همین سراغ روش دوم یعنی فایل پارامتر می‌رویم.

با توجه به داکیومنت اوراکل استفاده از remap_data در پارامتر فایل به شکل زیر امکان پذیر هستش

https://docs.oracle.com/database/121/SUTIL/GUID-B1D13216-93D3-4FFC-A0BB-082E133FD2B9.htm#SUTIL861

[mehdi@test ~]$ cat parmeter.par

REMAP_DATA=datapump_test.test.col_01:datapump_remap_test.toggle_case
REMAP_DATA=datapump_test.test.col_02:datapump_remap_test.toggle_case

اما من وقتی به این شکل فایل پارامتر ام رو می‌ساختم به خطای زیر می‌خوردم:

[root@db1 ~]# cat /home/oracle/parfile08.par
remap_schema=datapump_test.test.col_01:C##MAHDI_GH.OBFUSCATING.VAR
remap_schema=datapump_test.test.col_02:C##MAHDI_GH.OBFUSCATING.VAR
.
.
.

[oracle@db1 ~]$ expdp C##HB@pdb directory=backup dumpfile=OBFUSCATING_001.dmp logfie=/home/oracle/parfile11.par

Export: Release 12.2.0.1.0 - Production on Sun Aug 23 19:17:31 2020
Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved.

Connected to: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
ORA-39001: invalid argument value
ORA-39232: invalid remap function: C

بعد از ساختن ۱۲ پارامتر فایل و خواندن API دیتا پامپ، سرچ‌های بسیار و بعد از ۴ ساعت مشکل رو پیدا کردم. به این دلیل که به دست آوردن تجربه بسیار گران است من این تجربه رو با شما به اشتراک میذارم تا شما هم از این تجربه بهره ببرید.

برای حل این مشکل کافیه از علامت دابل کوتیشن " در ابتدا و انتهای دستور remap_data استفاده کنید.

[root@db1 ~]# cat /home/oracle/par/02.par

REMAP_DATA="datapump_test.test.col_01:C##MAHDI_GH.OBFUSCATING.VAR"
REMAP_DATA="datapump_test.test.col_02:C##MAHDI_GH.OBFUSCATING.VAR"
.
.
.

در بین تلاش برای رفع این مشکل و در آخرین لحظات ناامیدی از این پارامتر کامند لاین داشتم می‌رفتم که از یک بلاک PL-SQL و API Data Pump استفاده و کار رو انجام بدم که خوشبختانه راه‌حل مشکل رو کشف کردم.

اطلاعات بیشتر برای نحوه کار با API

https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_DATAPUMP.html

و یک مثال کوچک که نوشتم

dbms_datapump.data_remap (handle => dph,
name => 'job',
table_name => test,
column => phone,
function => 'C##MAHDI_GH.OBFUSCATING.NUM',
schema => 'hb');

در نهایت همیشه اکثر مشکلات توسط یک اراده قوی قابل حل هستند. اگر از این مطلب استفاده کردید اون رو به DBA های دیگه هم معرفی کنید و اگه پیشنهاد همکاری برای من داشتید می‌تونید با من در تماس باشید.

 

شاد و خرم باشید

بدرود