آشنایی با مفهوم Editioning و پارامترهای آن در دیتاپامپ

احتمالا تاکنون هنگام ایجاد یک آبجکت مانند ویو، با این خطا مواجه شده اید:

ORA-00955: name is already used by an existing object

همانطور که می دانید این خطا زمانی رخ می دهد که آبجکتی با نام مورد نظر قبلا در بانک موجود باشد.

گاهی ممکن است، بدلایل مختلف از جمله توسعه و تغییر در برنامه یا ساختار بانک اطلاعاتی، نیاز باشد در  متن یک ویو یا یک پروسیجر یا دستورات یک trigger تغییراتی را ایجاد کرده و عملکرد جدید آنها را قبل از استقرار کامل در سیستم تست کنیم.

مسلما ایجاد این آبجکتها با ساختار و نام جدید، نیاز به تغییرات در برنامه کاربردی دارد، که البته این موضوع خوشایند و مطلوب برنامه نویسان وکاربران نمی باشد.

اوراکل از نسخه ی 11g به بعد، قابلیت جدیدی با عنوان editioning را به پایگاه داده خود افزوده است.

edition یک ویژگی است که به صورت grant در اختیار کاربر اوراکل قرار می گیرد و در سطح session قابل تنظیم است و به کاربر این اجازه را می دهد تا برخی آبجکت ها را با همان نام قبلی شان، ولی با شکل و ساختار دیگری ایجاد نماید.

بعنوان مثال ایجاد پروسیجر در دو edition مختلف، با یک نام ولی با محتوای کاملا متفاوت امکان پذیر است.

آبجکت های نظیر view و synonym و آبجکتهای pl/sql ای مانند function , procedure , package package_body , type , library , trigger، که برروی storage بصورت فیزیکی ذخیره نمی شوند، آبجکتهایی هستند که می توانند با یک نام در چند ویرایش ایجاد گردند(در اوراکل 11g).

نام edition پیشفرض اوراکل، ora$base می باشد و همچنین می توان edition های مختلف دیگری با نام دلخواه ایجاد نمود و آبجکت یا آبجکتهای مورد نظر خود را در آن edition خاص ساخت.

در view های *_objects و *_objects_ae ستونی بنام edition_name قرار دارد که در آن، ویرایش یا edition هر آبجکت مشخص شده است. البته edition پیشفرض یعنی ora$base در این ستون نشان داده نمی شود.

SQL> select object_name,edition_name from all_objects

Edition جاری کاربر و تمام edition های موجود در بانک را نیز بصورت زیر می توان تشخیص داد.

SQL> select sys_context(‘userenv’, ‘current_edition_name’) from dual;

SYS_CONTEXT(‘USERENV’,’CURRENT_EDITION_NAME’)

——————————————————————————–

NASER_E1

SQL> select edition_name from all_editions;

EDITION_NAME                PARENT_EDITION_NAME            USA

————————–      ————————————-     ———

ORA$BASE                                                                                      YES

NASER_E1                          ORA$BASE                                         YES

MY_EDITION                     NASER_E1                                         YES

ایجاد edition

برای ایجاد و استفاده از edition های جدید، به ترتیب زیر عمل می کنیم:

–ابتدا دسترسی های create any edition و drop any edition را به کاربر مورد نظر داده و امکان editioning را برای کاربر فعال می کنیم، تا کاربر امکان ایجاد edition را داشته باشد:

SQL> grant create any edition, drop any edition to naser;

SQL> alter user naser enable editions;

–حال کاربر می تواند edition دلخواه خود را ایجاد نماید:

SQL>conn naser/naser

SQL> create edition new_edition;

–برای ساخت و استفاده از آبجکت ها در edition مورد نظر می بایست session جاری را به آن edition تنظیم کنیم:

SQL> alter session set edition=new_edition;

–پس از تنظیم session، می توان آبجکتهای خود را در ویرایش مورد نظر با همان نام قبل ولی به شکل های متفاوت ایجاد کرد.

مثال : ایجاد یک ویو در دو edition مختلف.

SQL>conn naser/naser

SQL> select sys_context(‘userenv’, ‘current_edition_name’) from dual;

SYS_CONTEXT(‘USERENV’,’CURRENT_EDITION_NAME’)

—————————————————————————————

ORA$BASE

SQL> create  view  vw_edition_test  as

            select  t.owner, t.table_name, t.tablespace_name, t.status, t.num_rows

              from  all_tables  t

            where  t.table_name  like  ‘TBL_%’;

SQL> select object_name,edition_name from user_objects;

OBJECT_NAME                   EDITION_NAME

—————————           ————————

VW_EDITION_TEST            ORA$BASE

SQL> desc vw_edition_test;

Name                                   Type                                     Nullable                               Default                  Comments

————————–             ————————–             ————–             —————           ——————-

OWNER                                VARCHAR2(30)                          

TABLE_NAME                     VARCHAR2(30)                          

TABLESPACE_NAME          VARCHAR2(30)                   Y                        

STATUS                                VARCHAR2(8)                     Y                        

NUM_ROWS                                      NUMBER                Y

ایجاد همان ویو در یک edition دیگر:

SQL> create edition naser_e1;

SQL> alter session set edition=naser_e1;

SQL> select sys_context(‘userenv’, ‘current_edition_name’) from dual;

SYS_CONTEXT(‘USERENV’,’CURRENT_EDITION_NAME’)

——————————————————————————-

NASER_E1

SQL> create  or  replace  view vw_edition_test  as

           select  t.owner, t.table_name, t.tablespace_name  from  all_tables  t;

SQL> select object_name,edition_name from user_objects;

OBJECT_NAME                   EDITION_NAME

—————————           ————————

VW_EDITION_TEST            NASER_E1

SQL> desc vw_edition_test

Name                                   Type                                     Nullable                               Default                  Comments

—————————-          ————————-              —————           —————           ——————

OWNER                                VARCHAR2(30)                          

TABLE_NAME                     VARCHAR2(30)                          

TABLESPACE_NAME          VARCHAR2(30)                   Y                        

 

با grant use on edition می توان edition مورد نظر را برای کاربر یا تمام کاربران دیگر قابل استفاده نمود.

SQL> GRANT USE ON EDITION edition_name TO [PUBLIC/USERNAME]

همچنین می توان edition پیشفرض سیستم را به edition مورد نظر تغییر داد.

SQL> ALTER DATABASE DEFAULT EDITION = edition_name

برای آشنایی بیشتر با موضوع edition، به مباجث editioning در اوراکل مراجعه کنید.

پارامتر source_edition در expdp/impdp

SOURCE_EDITION=edition_name

پارامتر source_edition تعیین می کند که کدام ویرایش از آبجکت، export/import شود و فقط زمانی که دو ویرایش یا بیشتر از یک آبجکت وجود داشته باشد بکار می رود.

پارامتر source_edition در زمان import فقط در حالت network importing (فقط با پارامتر network_link) استفاده می شود.

مثال:

در این مثال shz_dblink نام دیتابیس لینک به بانک مبدا است که می خواهیم اطلاعات در قالب my_edition در این بانک بارگذاری شود.

~]$ impdp   naser   directory=dump    source_edition=my_edition   

network_link=shz_dblink   exclude=users

پارامتر TARGET_EDITION در expdp/impdp

TARGET_EDITION=edition_name

این پارامتر تعیین می کند که آبجکتها در چه ویرایشی در بانک مقصد بارگذاری شود.

اگر پارامتر target_edition تنظیم نشود، edition پیشفرض در نظر گرفته می شود (ora$base یا هر edition دیگری که بعنوان پیشفرض تعیین شده است)، حتی اگر در زمان export توسط پارامتر source_edition ویرایش خاصی تعیین شده باشد.

اگر ویرایش تعیین شده در target_edition در بانک مقصد وجود نداشته باشد ، پیغام خطا صادر می شود.

مثال :در این مثال ویو های ساخته شده ی بالا را به بانک دیگری منتقل می کنیم.

بانک مبدا :

SQL> alter session set edition=naser_e1;

SQL> desc vw_edition_test

Name                                   Type                                     Nullable                               Default                  Comments

—————————-          ————————-              —————           —————           ——————

OWNER                                VARCHAR2(30)                          

TABLE_NAME                     VARCHAR2(30)                          

TABLESPACE_NAME          VARCHAR2(30)                   Y                        

 

~]$ expdp naser directory=dump dumpfile=edition_test01.dmp include=view  source_edition=naser_e1

بانک مقصد :

SQL> conn naser/naser

SQL> create edition edition02;

~]$ impdp   naser  directory=dump  dumpfile=edition_test01.dmp

 target_edition=edition02

.  .  .

SQL> conn naser/naser

SQL> select sys_context(‘userenv’, ‘current_edition_name’) from dual;

SYS_CONTEXT(‘USERENV’,’CURRENT_EDITION_NAME’)

—————————————————————————————

ORA$BASE

SQL> desc vw_edition_test

ERROR:

ORA-04043: object vw_edition_test does not exist

SQL> alter session set edition=edition02;

SQL> desc vw_edition_test

Name                                   Type                                     Nullable                               Default                  Comments

—————————-          ————————-              —————           —————           ——————

OWNER                                VARCHAR2(30)                          

TABLE_NAME                     VARCHAR2(30)                          

TABLESPACE_NAME          VARCHAR2(30)                   Y                        

 

آدرس کانال تلگرام: ORACLEDB@

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.