احتمالا تاکنون هنگام ایجاد یک آبجکت مانند ویو، با این خطا مواجه شده اید:
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