2009년 11월 18일 수요일

ORACLE_027. Managing Tables Part - I

Creating Tables

Creating a Table
 다음 구문을 입력하면, admin_emp 라는 이름의 테이블을 admin_tbs 테이블 스페이스의 hr 스키마로 테이블을 생성할 수 있습니다.

   CREATE TABLE   hr.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),
               comm           NUMBER(7,2),
               deptno          NUMBER(3) NOT NULL CONSTRAINT admin_dept_fkey
                                                                    REFERENCE hr.department (department_id) )
   TABLESPACE dmin_tbs
   STORAGE ( INITAIL 50K
                    NEXT    50K
                    MAXEXTENTS 10
                    PCTINCREASE 25 );

Creating a Temporary Table
 임시 테이블을 만드는 것도 가능합니다. 임시 테이블로 정의를 하면 모든 세션에 사용가능하지만 임시 테이블의 데이터는 해당 데이터를 테이블에 넣은 세션의 사용자만 볼 수 있습니다. CREATE GLOBAL TEMPORARY TABLE 구문을 통해서 임시 테이블을 생성할 수 있습니다. ON COMMIT 키워드의 옵션에 따라 트렌젝션 의존적인지 세션 의존적인지를 결정할 수 있습니다.

  • ON COMMIT DELETE ROWS
    트렌젝션이 COMMIT 된 순간 해당 임시 테이블의 모든 행은 삭제됩니다.
  • ON COMMIT PRESERVE ROWS
    세션이 종료될 경우 임시 테이블에 있는 모든 행은 삭제됩니다.

 다음 예제는 트랜젝션 의존적인 임시 테이블을 만드는 방법입니다.

   CREATE GLOBAL TEMPORARY TABLE admin_work_area
               (startdate DATE,
                 enddate DATE,
                 class    CHAR(20))
          ON COMMIT DELETE ROWS;

 임시 테이블에 인덱스가 만들어지기도 합니다. 해당 인덱스도 임시이고 테이블에 있는 데이터에 기반하여 세션이나 트랜젝션이 유효할 동안만 존재합니다.

 

Parallelizing Table Creation
 테이블을 만들때 AS SELECT 단서를 이용할 경우 PARALLEL 구문을 주어 수행할 수 있습니다. CREATE TABLE ... AS SELECT 구문은 두 파트로 이루어져 있습니다. 첫번째는 CREATE 파트(DDL), 두번째는 SELECT 파트(query) 입니다. 오라클은 이 두 파트를 병렬로 수행할 수 있습니다. 다음의 내용중 하나라도 해당사항에 포함된다면 CREATE 파트는 병렬로 수행할 수 있습니다.

  • PARALLEL 단서가 CREATE TABLE ... AS SELECT 구문에 포함 되었을 경우
  • ALTER SESSION FORCE PARALLEL DDL 구문이 정의되었을 경우

 쿼리 파트가 다음 사항을 모두 만족할 경우 병렬로 수행됩니다.

  • 쿼리가 병렬수행의 힌트절(PARALLEL 또는 PARALLEL_INDEX)을 가지고 있을경우나 CREATE 파트가 PARALLEL 단서를 가지고 있을 경우, 또는 스키마 오브젝트가 참조하는 쿼리가 PARALLEL 정의가 되어 있을 경우.
  • 최소 하나의 테이블이 여러개의 파티션을 풀 테이블 스켄하거나 인덱스 범위 스켄을 하도록 지정되어 있을 경우

 테이블을 병렬로 만들 경우 병렬 정의(PARALLEL)가 테이블에 정의됩니다. 어떤 다음 DML 이나 쿼리가 테이블에 사용된다고 하여도 - 병렬수행이 가능하다면 - 병렬로 수행하려 할 것 입니다.

 다음은 병렬수행을 하는 테이블을 만드는 방법입니다.

   CREATE TABLE hr.admin_emp_dept
      PARALLEL
      AS SELECT * FROM hr.employees
      WHERE department_id = 10;

Automatically Collecting Statistics on Tables
 PL/SQL 패키지인 DBMS_STATS 는 코스트 기반의 최적화를 위한 통계정보를 생성하고 관리할 수 있게 해 줍니다. 이 패키지를 이용하여 통계정보를 수집, 변경, 확인, 익스포트, 임포트 그리고 삭제를 할 수 있습니다. 또한 수집된 통계정보에 이름을 부여하여 통계정보를 구분할 수 있습니다.

 CREATE (혹은 ALTER) TABLE 구문에 MONITORING 단서를 달아서 DBMS_STATS 가 자동으로 테이블의 통계정보를 수집할 수 있게 할 수 있습니다.

 모니터링을 해제하기 위해서는 NOMONITORING 단서를 달면 됩니다.

 

 

Altering Tables

 ALTER TABLE 구문을 이용하여 테이블을 변경할 수 있습니다. 테이블을 변경하기 위해 해당 테이블은 해당 스키마에 포함되어 있어야 하거나 오브젝트에 대한 ALTER 권한을 가지거나 ALTER ANY TABLE 시스템 권한이 있어야 합니다.

 테이블을 변경하는 이유는 다양합니다.

  • 물리적인 특성을 변경하기 위해 (PCTFREE, PCTUSED, INITRANS, MAXTRANS, 혹은 스토리지 파라메터)
  • 테이블을 새로운 세그먼트나 새로운 테이블스페이스로의 이동
  • 익스텐트를 할당하거나 사용하지 않는 공간을 해제하기 위해
  • 컬럼의 추가, 이름 변경, 컬럼의 정의를 변경할때 (데이터 타입, 길이, 기본값, NOT NULL 제약조건)
  • 테이블의 로깅 옵션을 변경할때
  • CACHE/NOCACHE 특성을 병경할때
  • 테이블과 연관된 제약조건들을 변경하거나 추가
  • 병렬처리의 DEGREE 값을 변경하기 위해
  • 통계정보의 수집/비수집(MONITORING/NOMONITORING)
  • 테이블명 변경
  • IOT(Index-Organized Table)의 특성 변경하거나 추가
  • 대외 테이블의 특성 변경
  • LOB 컬럼의 변경 혹은 추가
  • 오브젝트 타임의 변경 및 추가

Altering Physical Attributes of a Table

 테이블의 데이터블록 공간을 파라메터(PCTFREE 와 PCTUSED)로 변경시키면 데이터가 들어있는 블록을 보함한 테이블이 소유하고 있는 모든 공간에 대한 설정값이 변경됩니다. 하지만 이미 데이터가 들어있는 데이터 블록의 재정렬 작업은 즉시 일어나진 않고 재정렬이 필요할 시에 재정렬이 수행됩니다.

 테이블의 트랜젝션 엔트리 설정(INITRANS, MAXTRANS)을 변경할때 새로운 INITRANS 값은 새로운 MAXTRANS 값이 테이블의 모든 블록에 적용될동안 순차적으로 적용됩니다.

 INITIAL 과 MINEXTENTS 파라메터는 변경할 수 없습니다. 다른 스토리지 파라메터(NEXT, PCTINCREASE)는 다음번에 추가로 생성되는 테이블의 익스텐트에만 적용이 됩니다. 다음 익스텐트의 크기 할당량은 현재의 NEXT 와 PCTINCREASE 값에 의해 정의되고 첫 생성시의 기본값에 영향을 받지 않습니다.

 

Moving a Table to a New Segment or Tablespace
 ALTER TABLE ... MOVE 구문은 파티션되지 않은 테이블의 데이터를 새로운 세그먼트에 위치시키거나 선택적으로 다른 테이블스페이스에 위치시킬 수 있습니다. 이 문은 또한 ALTER TABLE 구문으로는 변경할 수 없는 테이블 저장소에 관련된 특성을 변경할 수 있게 해 줍니다.

 다음 예제는 hr.admin_emp 테이블을 새로운 세그먼트로 옮기며 새로운 저장공간에 관한 파라메터를 설정합니다.

   ALTER TABLE hr.admin_emp MOVE
     STORAGE ( INITIAL 20K
                      NEXT 40K
                      MINEXTENTS 2
                      MAXEXTENTS 20
                      PCTINCREASE 0 );

 테이블이 LOB 컬럼을 가지고 있을시 사용자가 정의해 줄 경우에 LOB 데이터나 LOB 인덱스를 새로운 세그먼트로 옮길 수 있습니다. 정의하지 않으면 LOB 데이터와 LOB 인덱스는 옮겨지지 않습니다.

 

Manually Allocating Storage for a Table
 오라클은 필요할시에 테이블에 새로운 익스텐트를 동적으로 추가합니다. 하지만 사용자가 지금 당장 추가적으로 익스텐트를 할당할 수 있습니다.  새로운 익스텐트는 ALTER TABLE ... ALLOCATE EXTENT 구문을 통해 할당받습니다.  사용하지 않는 공간에 대한 익스텐트를 제거하기 위해서는 ATLER TABLE .. DEALLOCATE UNSED 구문을 사용하여 공간을 해제합니다.

 

Modifying an Existing Column's Definition
 ALTER TABLE ... MODIFY 구문을 통해 기 존재하는 컬럼의 데이터 타입, 기본값 혹은 제약조건등의 정의를 변경할 수 있습니다.

 또한 컬럼의 새로운 크기가 기존에 존재하는 컬럼의 데이터 크기를 만족한다면 컬럼의 크기 역시 바꿀 수 있습니다. 비어있지 않은 CHAR 컬럼의 크기를 조절하기 위해서는 BLANK_TRIMMING=TRUE 초기화 파라미터가 설정되어 있어야 합니다.

 CHAR 컬럼의 크기를 증가시키는 것은 시간을 요구하는 명령이며 추가적인 공간이 요구될 수도 있는 작업이며 특히 많은 행을 가진 테이블에서 그렇습니다. 이는 각 행의 CHAR 의 값이 새로운 컬럼의 길이를 맞추기 위한 빈 공간이 삽입되기 때문입니다.

 

Adding Table Columns
 기 존재하는 테이블에 컬럼을 추가하기 위해 ALTER TABLE ... ADD 구문을 사용합니다. 다음 구문은 hr.admin_emp 테이블에 bonus 컬럼을 추가하는 명령입니다.

   ALTER TABLE hr.admin_emp ADD (bonus NUMBER(7,2));

 테이블에 새로운 컬럼이 추가될시 DEFAULT 단서를 달지 않았다면 초기 값은 NULL 입니다. 기본값을 정의하면서 새로운 컬럼을 만들면 각 행에 기본값을 넣으며 컬럼을 추가합니다.

 테이블이 아무 행도 가지고 있지 않거나 기본값을 정의했다면 NOT NULL 제약조건을 사용할 수 있습니다.

 

Renaming Table Columns
 테이블이 이미 존재하는 컬럼의 이름을 바꿀 수 있습니다. ALTER TABLE .. RENAME COLUMN 구문을 이용하면 됩니다. 새로운 컬럼명은 이미 존재하는 다른 컬럼들과 이름이 겹쳐서는 안됩니다. RENAME COLUMN 에 추가적으로 달리는 명령은 없습니다.

  다음 예제는 hr.admin_emp 테이블의 comm 컬럼명을 바꾸는 방법입니다.

   ALTER TABLE hr.admin_emp RENAME COLUMN comm TO commission;

  테이블의 컬럼명을 바꾸는 것은 해당 컬럼을 참조하는 의존적인 오브젝트를 무효로 만들 수 있습니다만 컬럼명을 바꿀시 오라클은 function-based indexes 와 check constraints 는 유효상태로 두기위해 딕셔너리 테이블은 업데이트를 합니다.

 

Dropping Table Columns
 테이블이나 IOT (Index-organized Table)에서 더이상 필요하지 않은 컬럼이 있다면 삭제할 수 있습니다. 이는 데이터베이스의 공간 관리를 편하게 해 주며, 데이터를 익스포트/임포트하고 인덱스와 제약조건을 다시 만드는 행위를 막아줍니다.

 SYS 가 소유하고 있는 테이블의 컬럼이나 한 테이블의 모든 컬럼을 제거할 수는 없습니다.

 

Removing Columns from table
 ALTER TABLE ... DROP COLUMN 구문을 수행시 테이블의 각 행에서 컬럼에 대한 기술과 연관된 데이터는 삭제됩니다. 또한 한번에 여러개의 컬럼을 지울 수 있습니다. 다음 예제는 hr.admin_emp 테이블에서 컬럼을 제거하는 방법입니다.

   ALTER TABLE hr.admin_emp DROP COLUMN sal;

 다음 예제는 bonus 와 comm 컬럼을 한번에 삭제하는 방법입니다.

   ALTER TABLE hr.admin_emp DROP COLUMN (bonus, comm);

Marking Columns Unused
 큰 테이블에서 컬럼을 삭제하느라 시간이 오래 걸릴것이 걱정된다면 ALTER TABLE .. SET UNSED 구문을 사용하여 해결할 수 있습니다. 이 구문은 해당 컬럼을 사용하지 못하게 표시를 해 놓지만 데이터는 삭제되지 않고 이들이 사용하고 있는 공간을 해제하지도 않습니다. 하지만 표시된 컬럼은 더이상 쿼리나 데이터 딕셔너리 뷰를 통해 확인할 수 없으며 새롭게 만들게 되는 컬럼이 해당 이름을 사용할 수 있게 됩니다. 해당 컬럼에 속한 모든 제약조건, 인덱스, 그리고 통계정보 역시 삭제됩니다.

 hiredate 와 mgr 컬럼을 사용하지 않는 컬럼으로 설정하기 위해 다음 방법을 사용하면 됩니다.

   ALTER TABLE hr.admin_emp SET UNSED (hiredate, mgr);

 후에 표시된 컬럼을 삭제하기 위해 ALTER TABLE .. DROP UNSED COLUMNS 구문을 통해 수행할 수 있습니다.

 USER_UNUSED_COL_TABS, ALL_UNSED_COL_TABS, DBA_UNSED_COL_TABS 뷰를 통해 테이블에 사용하지 않게 표시된 컬럼이 몇개 있는지 확인할 수 있습니다. COUNT 필드는 해당 테이블의 사용하지 않는 컬럼 갯수 입니다.

Removing Unsed Columns
 ALTER TABLE .. DROP UNUSED COLUMNS 은 오직 UNUSED 표시가 되어 있는 컬럼에만 적용됩니다. 물리적으로 테이블의 컬럼을 삭제하며 차지하고 있던 공간도 반환됩니다.

 다음 예제는 CHECKPOINT 단서가 달려 있습니다. 이 옵션은 정의된 숫자만큼의 행에서 컬럼 데이터가 삭제되었을시 체크포인트가 발생하게 되며 이 예제에서는 250개의 행마다 수행후 체크포인트가 발생됩니다. 체크포인트를 통해 언도 스페이스의 공간이 전부 소진되는 것을 막으며 언두 로그의 크기를 줄이는 역할을 합니다.

   ALTER TABLE hr.admin_emp DROP UNUSED COLUMNS CHECKPOINT 250;

 

 

Redefining Tables Online

 때때론 상당히 크고 자주 사용하는 테이블들의 쿼리 성능을 향상시키거나 이들에게 DML 작업을 수행해야 할 때가 있습니다. 오라클은 이러한 테이블들의 정의를 온라인 상에서 변경할 수 있는 메커니즘을 제공하고 있습니다.

The DBMS_REDEFINITION Package
 온라인상에서 테이블을 재정의 하는 방법은 DBMS_REDEFINITION PL/SQL 패키지를 사용하는 방법 입니다. 이 패키지를 수행하기 위해서는 EXECUTE_CATALOG_ROLE 권한이 있어야 하며 더불어 다음의 권한 역시 요구됩니다.

  • CREATE ANY TABLE
  • ALTER ANY TABLE
  • DROP ANY TABLE
  • LOCK ANY TABLE
  • SELECT ANY TABLE

Steps for Online Redifinition of Tables
 온라인 상에서 테이블 정의를 변경하기 위해서는 다음 순서를 따릅니다.
  1. 재정의 하는 두가지 방법중 다음 한가지를 선택합니다.

    • 첫번째 방법은 재정의를 하는데 프라이머리 키를 사용하는 방법입니다. 이 방법은 테이블의 재정의 전후와 비교하여 같은 프라이머리 키 컬럼을 가지고 있게 됩니다. 이 방법은 재정의의 기본 방법입니다.

    • 재정의의 두번째 방법은 Rowid를 이용하는 방법입니다. 이 방법은 IOT(Index Organized Table)이 아닐 경우에 사용할 수 있습니다. 또한 이 방법은 숨겨진 컬럼(M_ROW$$) 이 추가되며 테이블 재정의가 끝난후 이 컬럼을 UNSED 로 설정하거나 아니면 삭제하기를 권장합니다.

  2. DBMS_REDEFINITION.CAN_REDEF_TABLE() 프로시저를 이용하여 온라인 상에서 테이블을 변경하거나 재정의 하는 방법을 확인하도록 하십시요. 만약 해당 테이블이 온라인상에서 변경할 수 없는 테이블이라면 왜 온라인상에서 테이블을 변경할 수 없는지를 설명하는 에러 메세지가 출력될 것 입니다.

  3. 변경하고자 했던 테이블의 속성을 가진 (재정의 될 테이블과 같은 스키마로)임시 테이블을 만듭니다. 만약 재정의 될 테이블중 드롭될 컬럼이 있다면, 해당 컬럼은 임시 테이블에 만들지 않습니다. 컬럼이 추가된다면 임시 테이블에도 추가될 컬럼을 포함하여 생성하도록 합니다.

  4. DBMS_REDEFINITION.START_REDEF_TABLE() 를 다음의 값을 주어 호출하여 테이블 재정의를 시작합니다.

    • 재정의될 테이블
    • 임시 테이블
    • 컬럼 맵핑
    • 재정의 수단

    만약 컬럼 매핑정보를 제공하지 않으면 모든 컬럼(기존의 컬럼명 그대로) 이 임시 테이블에 포함되어 있어야 합니다. 컬럼 매핑 정보를 제공한다면 명확히 매핑된 컬럼에 대해서만 재정의 작업이 수행됩니다. 재정의 수단을 제공하지 않으면 기본적으로 프라이머리 키를 이용한 재정의 작업을 수행하게 됩니다.

  5. 트리거, 인덱스, 권한, 제약조건을 임시 테이블에 작성합니다. 임시 테이블에 포함된 어떤 제약조건이라도 반드시 Disable 상태로 만들어야 합니다. 재정의 과정이 성공하든 실패하든 임시 테이블에 존재하는 어떤 트리거들도 수행되지 않습니다.

    재정의가 완료되면 임시테이블의 트리거, 제약조건, 인덱스, 그리고 권한을 재정의 된 테이블에 대체시킵니다. 임시테이블의 참조 제약조건은 재정의된 테이블에 전송하고 해당 제약조건들을 Enable 시킵니다.

  6. DBMS_REDEFINITION.FINISH_REDEF_TABLE() 프로시저를 호출하여 테이블의 재정의를 완료합니다. 이 과정동안 원래의 테이블은 Exclusive Lock 을 걸게 됩니다. 이 과정에서 다음과 같은 일이 발생하게 됩니다.

    • 원래의 테이블은 임시 테이블의 특성, 인덱스, 제약조건, 권한 그리고 트리거와 같이 재정의 됩니다.
    • 임시 테이블의 제약조건들은 이제 재정의된 테이블도 해당 제약조건을 가지고 있으며 활성된 상태로 있습니다.

  7. 선택적으로 변경된 임시테이블의 인덱스, 트리거, 제약조건들은 재정의된 테이블에 함께 적용됩니다. ROWID를 이용하여 재정의를 했으면 재정의된 테이블은 숨겨진 컬럼(M_ROW$$)를 가지게 되고 이 숨겨진 컬럼은 다음과 같은 방법으로 사용하지 않게 마킹에 해두는 것을 권장합니다.

    ALTER TABLE table_name SET UNUSED (M_ROW$$);

  8. 다음은 재정의 과정의 마지막 결과 입니다.

    • 원본 테이블의 형식과 모양은 임시 테이블과 같이 재 정의 됩니다.
    • 트리거, 권한, 인덱스, 그리고 제약조건은 START_REDEF_TABLE() 이후에 정의되고 FINISH_REDEF_TABLE() 이전에 재정의될 테이블에 정의됩니다. 재정의 과정 전에 있던 임시 테이블의 참조 제약조건은 재정의 된 테이블에 적용되며 활성화 됩니다.
    • 기존 재정의 되기 전의 원본 테이블이 가지고 있는 인덱스, 권한, 트리거, 제약조건등은 임시 테이블에 그대로 정의되며 사용자가 임시 테이블을 삭제할때 같이 제거됩니다. 원래의 제약조건등은 임시 테이블에 존재하게 되며, 비활성화 된 상태로 있게 됩니다.
    • 재정의 전의 원본 테이블에 정의되 있던 PL/SQL 프로시저나 커서는 더이상 사용할 수 없습니다. 이들은 다음 언젠가 수행하기 전 자동으로 재확인 하게 됩니다. (재정의 과정의 결과로 테이블의 모양이 바뀌게 되면 재확인 절차는 실패하게 됩니다.)

 

Intermediate Syncronization

 START_REDEF_TABLE() 을 호출하여 재정의 과정을 수행 후 FINISH_REDEF_TABLE() 이 호출되기 전까지 많은 수의 DML 명령이 원본 테이블에 수행될 수 있습니다. 이러한 경우 임시 테이블을 원본 테이블과 주기적으로 동기화를 시켜주는 것을 권장합니다. 이 방법은 DBMS_REDEFINITION.SYNC_INTERM_TABLE() 프로시저를 통해 수행할 수 있습니다. 이 프로시저를 호출함으로써 FINISH_REDEF_TABLE()을 호출하여 재정의를 마치는 사이의 시간을 절약할 수 있습니다.

Abort and Cleanup After Errors
 재정의 과정에서 에러가 발생하게 되거나 재정의 작업을 취소하고 싶다면 DBMS_REDEFINITION.ABORT_REDEF_TABLE() 프로시저를 호출할 수 있습니다. 이 프로시저는 임시 로그와 재정의 작업과 관련된 테이블들을 제거합니다. 이 프로시저가 호출된 후 임시 테이블, 임시 테이블과 연관된 오브젝트들을 삭제할 수 있습니다.

 

Example of Online Table Redefinition

 다음 예제는 empno, ename, job, deptno 컬럼을 가진 hr.admin_emp 테이블을 온라인중에 테이블을 재정의 하는 과정입니다. 이 테이블은 다음과 같이 재정의 됩니다.

  • mgr, hiredate, sal, bonus 컬럼의 추가
  • 새로운 컬럼은 0으로 초기화
  • deptno 컬럼은 10 단위로 증가
  • 재정의된 테이블은 empno 기준으로 파티션됨

 이 과정은 다음과 같습니다.

  1. 해당 테이블이 온라인상에서 재정의가 가능한지 검증합니다.

    BEGIN
    DBMS_REDEFINITION.CAN_REDEF_TABLE('hr','admin_emp',dbms_redefinition.cons_use_pk);
    END;
    /
  2. 임시 테이블 hr.int_amdin_emp 를 만듭니다.

    CREATE TABLE hr.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 admin_tbs,
         PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE admin_tbs2)
  3. 재정의 과정을 시작합니다.

    BEGIN
    DBMS_REDEFINITION.START_REDEF_TABLE
     ('hr','admin_emp','int_admin_emp',
      'empno empno, ename ename, job job, deptno+10 deptno,0 bonus',dbms_redefinition.cons_use_pk);
    END;
    /
  4. hr.int_admin_emp 에 트리거, 인덱스, 제약조건을 만듭니다. 재정의의 마지막 과정에서 이것들은 원본 테이블로 전송됩니다. hr.int_admin_emp 테이블의 제약조건들은 비활성 상태여야 합니다. 임시테이블과 연관된 어던 권한도 줄 수 있습니다. 재정의가 끝나면 원본 테이블에 권한을 덮어 씁니다.

    ALTER TABLE hr.int_admin_emp ADD CONSTRAINT admin_dept_fkey2
          FOREIGN KEY (deptno) REFERRENCE hr.departments (department_id);
    ALTER TABLE hr.int_admin_emp MODIFY CONSTRAINT admin_dept_fkey2
          DISABLE KEEP INDEX;

    비활성된 admin_dept_fkey2 제약조건은 재정의 과정의 마지막에 자동으로 활성화 되며 admin_emp 테이블에 적용됩니다.
  5. 선택적으로 임시 테이블 hr.int_admin_emp 에 동기화 작업을 수행할 수 있습니다.

    BEGIN
    DBMS_REDEFINITION.SYNC_INTERM_TABLE('hr','admin_emp','int_admin_emp');
    END;
    /
  6. 재정의 완료

    BEGIN
    DBMS_REDEFINITION.FINISH_REDEF_TABLE('hr','admin_emp','int_admin_emp');
    END;
    /
  7. 임시 테이블 삭제

Open Restrictions

 

 

Continue_

댓글 없음:

댓글 쓰기