CTAS 를 통한 테이블 복제시 제약 조건 0 5 8,686

by 타락천사 [타락천사] CTAS [2009.03.25 19:56:14]


CTAS[Create Table As Select .. ]  를 통한 테이블 복제시 제약 조건

 

   Local  Remote  
 Column Name, Type, Length    그대로 Copy 됨
 Column Default Value     No
 Index     No
 Constraint     No
 Not Null ( PK 에 의한 Not Null 포함 )    그대로 Copy 됨그대로 Copy 됨
 Grant     No
 Synonym     No
 Trigger     No

 

CTAS 를 통한 테이블 복제시 제약 조건

[ LOCAL ]

SCOTT>create table check_ctas ( a1 number , a2 number , a3 varchar2(100) default 'TG',
     a4 date default sysdate, a5 number default 444 ) ;

Table created.

SCOTT>create index xak1_check_ctas on check_ctas ( a1, a2 ) ;
Index created.

SCOTT>create index xak2_check_ctas on check_ctas ( a3, a4 ) ;
Index created.

SCOTT>create unique index xpk_check_ctas on check_ctas ( a1, a2 ,a3 ) ;
Index created.

SCOTT>alter table check_ctas add constraint xpk_check_ctas primary key
   ( a1, a2, a3 ) ;
Table altered.

SCOTT>alter table check_ctas add ( a6 number not null );
Table altered.

SCOTT>alter table check_ctas add ( a7 number null ) ;
Table altered.

SCOTT>insert into check_ctas (a1,a2,a6,a7) values ( 1,2,3,4) ;

1 row created.

SCOTT>insert into check_ctas (a1,a2,a6,a7) values ( 5,6,7,8 ) ;

1 row created.

SCOTT>commit ;

Commit complete.


SCOTT>grant select, delete on check_ctas to sys ;

Grant succeeded.

SCOTT>create public synonym check_ctas for check_ctas ;

Synonym created.

SCOTT>create or replace trigger update_trigger
    after
    insert or update on check_ctas
    for each row
    declare
    tg_number number ;
    begin
    update check_ctas set a3 = 4444;
    dbms_output.put_line('TG 4444');
   end ;
   /

Trigger created.

SCOTT>select count(*) from CHECK_CTAS ;

  COUNT(*)
----------
         2


SCOTT> select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT
              from user_tab_columns
             where table_name ='CHECK_CTAS' ;

TABLE_NAME                     COLUMN_NAM DATA_TYPE            DATA_LENGTH N DATA_DEFAULT
------------------------------ ---------- -------------------- ----------- - --------------------
CHECK_CTAS                     A1         NUMBER                        22 N
CHECK_CTAS                     A2         NUMBER                        22 N
CHECK_CTAS                     A3         VARCHAR2                     100 N 'TG'
CHECK_CTAS                     A4         DATE                           7 Y sysdate
CHECK_CTAS                     A5         NUMBER                        22 Y 444
CHECK_CTAS                     A6         NUMBER                        22 N
CHECK_CTAS                     A7         NUMBER                        22 Y

7 rows selected.


SCOTT> select table_name, index_name from user_indexes where table_name ='CHECK_CTAS' ;

TABLE_NAME                     INDEX_NAME
------------------------------ ------------------------------
CHECK_CTAS                     XAK1_CHECK_CTAS
CHECK_CTAS                     XAK2_CHECK_CTAS
CHECK_CTAS                     XPK_CHECK_CTAS

SCOTT>select TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE
            from user_constraints where table_name ='CHECK_CTAS';

TABLE_NAME                     CONSTRAINT_NAME                C
------------------------------ ------------------------------ -
CHECK_CTAS                     XPK_CHECK_CTAS                 P
CHECK_CTAS                     SYS_C0015871                   C

SCOTT> select CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME
             from user_cons_columns where table_name ='CHECK_CTAS'


CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAME
------------------------------ ------------------------------ --------------------
XPK_CHECK_CTAS                 CHECK_CTAS                     A1
XPK_CHECK_CTAS                 CHECK_CTAS                     A2
XPK_CHECK_CTAS                 CHECK_CTAS                     A3
SYS_C0015871                   CHECK_CTAS                     A6

SCOTT>select TABLE_NAME, GRANTEE, PRIVILEGE
            from user_Tab_privs where table_name ='CHECK_CTAS';

TABLE_NAME                     GRANTEE                        PRIVILEGE
------------------------------ ------------------------------ ----------------------------------------
CHECK_CTAS                     SYS                            DELETE
CHECK_CTAS                     SYS                            SELECT

COTT> select OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
          from all_synonyms  where table_name ='CHECK_CTAS';

OWNER                SYNONYM_NAME                   TABLE_OWNER                    TABLE_NAME
-------------------- ------------------------------ ------------------------------ ------------------------------
PUBLIC               CHECK_CTAS                     SCOTT                          CHECK_CTAS


SCOTT> select TRIGGER_NAME, TRIGGER_TYPE, STATUS
            from user_triggers where TABLE_NAME='CHECK_CTAS';

TRIGGER_NAME                   TRIGGER_TYPE     STATUS
------------------------------ ---------------- --------
UPDATE_TRIGGER                 AFTER EACH ROW   ENABLED


[ REMOTE ]

SCOTT> create table copy_check_ctas as select * from check_ctas@LOCAL ;

Table created.


-- 칼럼 갯수 체크
SCOTT>select count(*) from copy_check_ctas ;

  COUNT(*)
----------
         2

-- 테이블 칼럼 체크
SCOTT>select TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE, DATA_DEFAULT
           from user_tab_columns where table_name ='COPY_CHECK_CTAS';

TABLE_NAME                     COLUMN_NAM DATA_TYPE            DATA_LENGTH N DATA_DEFAULT
------------------------------ ---------- -------------------- ----------- - --------------------
COPY_CHECK_CTAS                A1         NUMBER                        22 N
COPY_CHECK_CTAS                A2         NUMBER                        22 N
COPY_CHECK_CTAS                A3         VARCHAR2                     100 N
COPY_CHECK_CTAS                A4         DATE                           7 Y
COPY_CHECK_CTAS                A5         NUMBER                        22 Y
COPY_CHECK_CTAS                A6         NUMBER                        22 N
COPY_CHECK_CTAS                A7         NUMBER                        22 Y

7 rows selected.


==> Table / Column Name, Type, Length 및 Nullable 은 Copy 되어지나,
    Column 의 Default 값은 Copy 되지 않는다.

-- 테이블의 인덱스 체크
SCOTT>select table_name, index_name from user_indexes
            where table_name ='COPY_CHECK_CTAS';

no rows selected
==> Index 는 Copy 되지 않는다.

-- Constraint 체크
SCOTT>select TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE
           from user_constraints where table_name ='COPY_CHECK_CTAS';

TABLE_NAME                     CONSTRAINT_NAME                C
------------------------------ ------------------------------ -
[ Local ]
CHECK_CTAS                     XPK_CHECK_CTAS                 P
CHECK_CTAS                     SYS_C0015871                   C
[ Remote ]
COPY_CHECK_CTAS                SYS_C005644                    C
COPY_CHECK_CTAS                SYS_C005645                    C
COPY_CHECK_CTAS                SYS_C005646                    C
COPY_CHECK_CTAS                SYS_C005647                    C

==> Constraint 는 Copy 되지 않는다. [ NOT NULL 만 COPY 된다. ]


SCOTT>select CONSTRAINT_NAME, TABLE_NAME, COLUMN_NAME
           from user_cons_columns where table_name ='COPY_CHECK_CTAS';

CONSTRAINT_NAME                TABLE_NAME                     COLUMN_NAM
------------------------------ ------------------------------ ----------
SYS_C005644                    COPY_CHECK_CTAS                A1
SYS_C005645                    COPY_CHECK_CTAS                A2
SYS_C005646                    COPY_CHECK_CTAS                A3
SYS_C005647                    COPY_CHECK_CTAS                A6

==> 정확하게 이야기 하면 NOT NULL 조건은 COPY 된다.
    LOCAL  - NOT NULL, Primary Constraint(칼럼3개로 구성) 가
    REMOTE - NOT NULL, 칼럼 3개에 대한 NOT NULL 만 COPY 됨 [ Primary Constraint 는 Copy 되지 않는다. ]  

-- 테이블 권한 체크
SCOTT>select TABLE_NAME, GRANTEE, PRIVILEGE
            from user_Tab_privs where table_name ='COPY_CHECK_CTAS';

no rows selected
==> 권한은 Copy 되지 않는다.

-- 시노님 체크
SCOTT>select OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
           from all_synonyms  where table_name ='COPY_CHECK_CTAS';

no rows selected
==> Public Synonym 역시 Copy 되지 않는다.


-- 트리거 체크
SCOTT>select TRIGGER_NAME, TRIGGER_TYPE, STATUS
            from user_triggers where TABLE_NAME='COPY_CHECK_CTAS';
no rows selected
==> Trigger 역시 Copy 되지 않는다.

by 다솜여우 [2009.03.27 12:40:33]
주기적으로 CTAS로 작업해야하는 게 있는데, 제약조건이 copy가 안 되니 별도로 작업해야하니깐 시간이 오래걸리더라구요~~~~
다른 방법을 모색해봐야 할 것 같아요~~~
좋은 정보 감솨~~^^

by 타락천사 [2009.03.27 12:49:11]
import indexfile 지정 후
alter table 문장만 추출 하신 후에 일괄 적용 하면 될듯 싶네요..

by 다솜여우 [2009.03.28 00:52:22]
일괄 적용은 하는데요..
시간이 오래걸리거든요...
그게.. 고민이더라구요~~

by 타락천사 [2009.03.28 18:44:02]
드라큐라랑 잠깐 이야기 했는데..
데이타야
ctas 나 ctas where 1=2 후 insert /* append parallel */ ... select /*+ parallel */
하면 될것 같구...
그 후에 토드에서 쉽게 추출(alter table 및 create index(이건 병렬처리))
가능하지 않을까 체크 해볼까 해요..
유사한거 하지 않을까 싶어서 테스트 중인데..
체크 후 다시 알려드릴께요 ㅇ.ㅇ

by 웃는냐용이 [2009.04.01 10:23:08]
이렇게 깔끔하게 정리를 해주시니 머리에 쏙 들어왔습니다. 그동안 생각없이 CTAS 쓰고 있었네요. 감사합니다.
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입