Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

स्वचालित रोलबैक स्क्रिप्ट oracle

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% भरोसा नहीं करना चाहिए।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस लिंक के माध्यम से Oracle संग्रहीत कार्यविधि को कैसे निष्पादित करें

  2. Oracle SQL डेवलपर में प्रक्रिया कैसे बनाएं?

  3. Oracle में एक पंक्ति का sha1-हैश बनाना

  4. Oracle इंडेक्स क्लस्टरिंग फैक्टर की गणना कैसे की जाती है

  5. Oracle डाटाबेस में PL/SQL SYS_REFCURSOR कैसे बनाएं?