DBMS_METADATA_DIFF और कुछ मेटाडेटा क्वेरीज़ इस प्रक्रिया को स्वचालित कर सकती हैं।
यह उदाहरण 6 प्रकार के परिवर्तनों को प्रदर्शित करता है:1) एक कॉलम जोड़ना 2) एक क्रम बढ़ाना 3) एक टेबल छोड़ना 4) एक टेबल बनाना 5) एक दृश्य बदलना 6) एक सीमा आवंटित करना।
create table user1.add_column(id number);
create table user2.add_column(id number);
alter table user2.add_column add some_column number(5);
create sequence user1.increment_sequence nocache;
select user1.increment_sequence.nextval from dual;
select user1.increment_sequence.nextval from dual;
create sequence user2.increment_sequence nocache;
select user2.increment_sequence.nextval from dual;
create table user1.drop_table(id number);
create table user2.create_table(id number);
create view user1.change_view as select 1 a from dual;
create view user2.change_view as select 2 a from dual;
create table user1.allocate_extent(id number);
create table user2.allocate_extent(id number);
insert into user2.allocate_extent values(1);
rollback;
आप सही हैं कि DBMS_METADATA_DIFF CREATE
. के लिए काम नहीं करता है या DROP
. केवल एक स्कीमा में मौजूद किसी ऑब्जेक्ट को अलग करने का प्रयास करने से इस तरह एक त्रुटि संदेश उत्पन्न होगा:
ORA-31603: object "EXTRA_TABLE" of type TABLE not found in schema "USER1"
ORA-06512: at "SYS.DBMS_METADATA", line 7944
ORA-06512: at "SYS.DBMS_METADATA_DIFF", line 712
हालांकि, वस्तुओं को छोड़ना और जोड़ना निम्नलिखित के साथ स्क्रिप्ट करना आसान हो सकता है:
--Dropped objects
select 'DROP '||object_type||' USER1.'||object_name v_sql
from
(
select object_name, object_type from dba_objects where owner = 'USER1'
minus
select object_name, object_type from dba_objects where owner = 'USER2'
);
V_SQL
-----
DROP TABLE USER1.DROPPED_TABLE
--Added objects
select dbms_metadata.get_ddl(object_type, object_name, 'USER2') v_sql
from
(
select object_name, object_type from dba_objects where owner = 'USER2'
minus
select object_name, object_type from dba_objects where owner = 'USER1'
);
V_SQL
-----
CREATE TABLE "USER2"."CREATED_TABLE"
( "ID" NUMBER
) SEGMENT CREATION DEFERRED
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
TABLESPACE "USERS"
परिवर्तनों को इस तरह एक SQL कथन के साथ नियंत्रित किया जा सकता है:
select object_name, object_type, dbms_metadata_diff.compare_alter(
object_type => object_type,
name1 => object_name,
name2 => object_name,
schema1 => 'USER2',
schema2 => 'USER1',
network_link1 => 'MYSELF',
network_link2 => 'MYSELF') difference
from
(
select object_name, object_type from dba_objects where owner = 'USER1'
intersect
select object_name, object_type from dba_objects where owner = 'USER2'
) objects;
OBJECT_NAME OBJECT_TYPE DIFFERENCE
----------- ----------- ----------
ADD_COLUMN TABLE ALTER TABLE "USER2"."ADD_COLUMN" DROP ("SOME_COLUMN")
ALLOCATE_EXTENT TABLE -- ORA-39278: Cannot alter table with segments to segment creation deferred.
CHANGE_VIEW VIEW -- ORA-39308: Cannot alter attribute of view: SUBQUERY
INCREMENT_SEQUENCE SEQUENCE ALTER SEQUENCE "USER2"."INCREMENT_SEQUENCE" RESTART START WITH 3
इन परिणामों के बारे में कुछ नोट्स:
- ADD_COLUMN अपेक्षानुसार काम करता है।
- ALLOCATE_EXTENT शायद एक गलत सकारात्मक है, मुझे संदेह है कि आप आस्थगित खंड निर्माण की परवाह करते हैं। यह आपके सिस्टम को प्रभावित करने की बहुत संभावना नहीं है।
- CHANGE_VIEW बिल्कुल भी काम नहीं करता है। लेकिन पिछले मेटाडेटा प्रश्नों की तरह, DBA_VIEWS का उपयोग करके इस स्क्रिप्ट को बनाने का एक अपेक्षाकृत आसान तरीका होना चाहिए।
- INCREMENT_SEQUENCE बहुत अच्छा काम करता है। अधिकांश समय कोई एप्लिकेशन अनुक्रम मानों की परवाह नहीं करता है। लेकिन कभी-कभी जब चीजें सिंक से बाहर हो जाती हैं तो आपको उन्हें बदलने की जरूरत होती है। यह
RESTART START WITH
वाक्यविन्यास बहुत मददगार हो सकता है। आपको इंडेक्स को छोड़ने या फिर से बनाने की ज़रूरत नहीं है, याincrement by
के साथ खिलवाड़ करने की ज़रूरत नहीं है कई बार। यह सिंटैक्स 12c मैनुअल में नहीं है। वास्तव में, मैं इसे Google पर कहीं भी नहीं ढूंढ सकता। ऐसा लगता है कि यह पैकेज गैर-दस्तावेज सुविधाओं का उपयोग कर रहा है।
कुछ अन्य नोट:
- पैकेज कभी-कभी बहुत धीमा हो सकता है।
- यदि सर्वर पर नेटवर्क लिंक एक समस्या है, तो आपको इसे दोनों सर्वरों के लिंक के साथ स्थानीय उदाहरण के माध्यम से चलाने की आवश्यकता होगी।
- झूठी सकारात्मक बातें हो सकती हैं। कभी-कभी यह केवल एक स्थान के साथ एक पंक्ति देता है।
इस प्रक्रिया को पूरी तरह से स्वचालित करना संभव है। लेकिन उपरोक्त मुद्दों और सभी . के साथ मेरे अनुभव के आधार पर ऐसे स्वचालित उपकरण, आपको इस पर 100% भरोसा नहीं करना चाहिए।