Online Table Redefinition Primer

 

Online Table Redefinition Primer 1

Trenutni opis tabele admin_emp. 1

Plan. 1

Potrebni grantovi 1

Verifikacija mogućnosti redefinicije. 2

Kreiranje pomoćne tabele. 2

Poroces redefinicije. 2

Kopiranje zavisnih objekata. 2

Proveriti eventualne greške. 3

Opciona sinhronizacija tabela. 3

Završiti proces redefinicije. 3

Uraditi drop pomoćne tabele. 4

Konačna struktura tabele ADMIN_EMP. 4

 

 

Trenutni opis tabele admin_emp

 

SQL> desc admin_emp

 Name                                      Null?    Type

 ----------------------------------------- -------- ------------

 EMPNO                                     NOT NULL NUMBER(5)

 ENAME                                     NOT NULL VARCHAR2(15)

 JOB                                                VARCHAR2(10)

 DEPTNO                                    NOT NULL NUMBER(3)

 

Plan

- dodavanje novih kolona mgr, hiredate, sal, bonus

- vrednost podataka u koloni bonus se inicijalizuje na vrednost 0 (0 bonus)

- vrednost podataka u koloni deptno povećava se za 10 (deptno+10 deptno)

- nova tabela se particionira po vrednosti za kolonu deptno

 

Potrebni grantovi

grant connect, resource to scott;

grant CREATE ANY TABLE to scott;

grant ALTER ANY TABLE to scott;

grant DROP ANY TABLE to scott;

grant LOCK ANY TABLE to scott;

grant SELECT ANY TABLE to scott;

grant execute on dbms_redefinition to scott;

grant CREATE ANY TRIGGER to scott;

grant CREATE ANY INDEX to scott;

 

 

Verifikacija mogućnosti redefinicije

BEGIN

DBMS_REDEFINITION.CAN_REDEF_TABLE('scott','admin_emp',

      DBMS_REDEFINITION.CONS_USE_PK);

END;

/

PL/SQL procedure successfully completed.

 

 

Kreiranje pomoćne tabele

CREATE TABLE int_admin_emp

        (empno      NUMBER(5) PRIMARY KEY,

         ename      VARCHAR2(15) NOT NULL,

         job        VARCHAR2(10),

         mgr        NUMBER(5),

         hiredate   DATE DEFAULT (sysdate),

         sal        NUMBER(7,2),

         deptno     NUMBER(3) NOT NULL,

         bonus      NUMBER (7,2) DEFAULT(1000))

     PARTITION BY RANGE(empno)

       (PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE TEST,

        PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE TEST)

/

Table created.

 

Poroces redefinicije

 

SQL> BEGIN

    DBMS_REDEFINITION.START_REDEF_TABLE('scott', 'admin_emp','int_admin_emp',

           'empno empno, ename ename, job job, deptno+10 deptno, 0 bonus',

            dbms_redefinition.cons_use_pk);

    END;

    /

PL/SQL procedure successfully completed.

 

 

Kopiranje zavisnih objekata

(Bug No.5054629, Filed 22-FEB-2006, Severity Minimal Loss of Service, WORKAROUND: Grant SYSDBA or run the online redefinition as SYS?!)

 

SQL> show user

USER is "SYS"

 

DECLARE

num_errors PLS_INTEGER;

BEGIN

DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('scott', 'admin_emp','int_admin_emp',

   DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);

END;

 

PL/SQL procedure successfully completed.

 

Proveriti eventualne greške

 

  SQL> select object_name, base_table_name, ddl_txt from

             DBA_REDEFINITION_ERRORS

            /

 

OBJECT_NAME                    BASE_TABLE_NAME                DDL_TXT

------------------------------ ------------------------------ ----------------------------------------------------------

ADMIN_EMP_PK                   ADMIN_EMP                      CREATE UNIQUE INDEX "SCOTT"."TMP$$_ADMIN_EMP_PK0" ON "SCOT

SYS_C004628                    ADMIN_EMP                      ALTER TABLE "SCOTT"."INT_ADMIN_EMP" MODIFY ("ENAME" CONSTR

SYS_C004629                    ADMIN_EMP                      ALTER TABLE "SCOTT"."INT_ADMIN_EMP" MODIFY ("DEPTNO" CONST

ADMIN_EMP_PK                   ADMIN_EMP                      ALTER TABLE "SCOTT"."INT_ADMIN_EMP" ADD CONSTRAINT "TMP$$_

 

Mogu se ignoriasati.

 

 

Opciona sinhronizacija tabela

 

BEGIN

DBMS_REDEFINITION.SYNC_INTERIM_TABLE('scott', 'admin_emp', 'int_admin_emp');

END;

/

 

Završiti proces redefinicije

 

BEGIN

DBMS_REDEFINITION.FINISH_REDEF_TABLE('scott', 'admin_emp', 'int_admin_emp');

END;

/

PL/SQL procedure successfully completed.

 

 

Uraditi drop pomoćne tabele

 

SQL> drop table INT_ADMIN_EMP;

 

 

Konačna struktura tabele ADMIN_EMP

 

CREATE TABLE SCOTT.ADMIN_EMP

(

  EMPNO     NUMBER(5),

  ENAME     VARCHAR2(15 BYTE)                   NOT NULL,

  JOB       VARCHAR2(10 BYTE),

  MGR       NUMBER(5),

  HIREDATE  DATE                                DEFAULT (sysdate),

  SAL       NUMBER(7,2),

  DEPTNO    NUMBER(3)                           NOT NULL,

  BONUS     NUMBER(7,2)                         DEFAULT (1000)

)

TABLESPACE TEST

PCTUSED    0

PCTFREE    10

INITRANS   1

MAXTRANS   255

PARTITION BY RANGE (EMPNO)

( 

  PARTITION EMP1000 VALUES LESS THAN (1000)

    LOGGING

    NOCOMPRESS

    TABLESPACE TEST

    PCTFREE    10

    INITRANS   1

    MAXTRANS   255

    STORAGE    (

                INITIAL          64K

                MINEXTENTS       1

                MAXEXTENTS       2147483645

                BUFFER_POOL      DEFAULT

               ), 

  PARTITION EMP2000 VALUES LESS THAN (2000)

    LOGGING

    NOCOMPRESS

    TABLESPACE TEST

    PCTFREE    10

    INITRANS   1

    MAXTRANS   255

    STORAGE    (

                INITIAL          64K

                MINEXTENTS       1

                MAXEXTENTS       2147483645

                BUFFER_POOL      DEFAULT

               )

)

NOCOMPRESS

NOCACHE

NOPARALLEL

MONITORING;

 

 

ALTER TABLE SCOTT.ADMIN_EMP ADD (

  PRIMARY KEY

 (EMPNO)

    USING INDEX

    TABLESPACE TEST

    PCTFREE    10

    INITRANS   2

    MAXTRANS   255

    STORAGE    (

                INITIAL          64K

                MINEXTENTS       1

                MAXEXTENTS       2147483645

                PCTINCREASE      0

               ));