---------- Oracle Database 10g: SQL Fundamentals II --------------

SqlF2-2 Managing Schema Object



- ALTER TABLE문 : 테이블 수정(Add column, modify column, define default, drop column)
    ex1) 컬럼추가 : alter table dept2 add(job_id varchar2(9));
    ex2) 컬럼수정 : alter table dept2 modify(LOC varchar2(30));
    ex3) 컬럼삭제 : alter table dept2 drop column job_id;

- SET UNUSED : 컬럼을 못쓰게함(USER_UNUSED_COL_TABS딕셔너리 뷰에 저장) 보이지는 않으나 지워진 것은 아님, 향후 필드 일괄 삭제 가능.
    ex) alter table dept2 set unused(job_id);
          alter table dept2 drop unused cloumns;

- Constraints 추가 : alter table문 사용, 추가/삭제/활성화/비활성화 가능하나 수정 불가.
      ex) alter table emp2 add constraint emp_mgr_fk foreign key(mgr) references emp(empno);

- Constraints 삭제 : ALTER TABLE table명 DROP constraint명
      ex) alter table emp2 drop constraint emp_mgr_fk;

- Constraints (비)활성화 : ALTER TABLE table명 DISABLE/ENABLE CONSTRAINT constraint명 [CASCADE];
       ex) alter table emp2 disable constraint emp2_mgr_fk cascade;


- CASCADE CONSTRAINTS :  Constraints를 가지고 있는 컬럼 삭제시 해당 컬럼에 걸려 있는 모든 Constraints를 삭제.
       ex) alter table test1 drop (pk) cascade constraints;
            (=  alter talbe test1 drop (pk,fk,col1);

- deferring Constraints : 커밋시 제약조건 적용 실패하면 롤백(세션과 제약조건 둘다 적용되어야 함)
      ex) set constraints t_id_pk immediate;               <- deferred모드 해제
      ex) set constraints t_id_pk deferred;
      ex) alter session set constraints = immediate;    <- 현재 세션에 deferred모드 해제
SQL> create table t(id number(10), constraint t_id_pk primary key(id) deferrable
 initially deferred);

테이블이 생성되었습니다.

SQL> insert into t values(1);

1 개의 행이 만들어졌습니다.

SQL> insert into t values(1);

1 개의 행이 만들어졌습니다.

SQL> select * from t;

        ID
----------
         1
         1


SQL> commit;
commit
*
1행에 오류:
ORA-02091: 트랜잭션이 롤백되었습니다
ORA-00001: 무결성 제약 조건(SCOTT.T_ID_PK)에 위배됩니다


SQL> select * from t;

선택된 레코드가 없습니다

- Index란? 스키마객체로써 포인터를 사용해 질의의 속도를 향상 시킨다. 디스크 읽기/쓰기를 줄일 수 있다. 테이블과는 상호 동립적이나 오라클 서버에 의해 자동으로 관리된다.

- Index 생성 :
    자동 : Primary key, Unique Constraint
    수동 : 사용자 직접 지정 (create index 인덱스명 on 테이블명(컬럼명[,컬럼명]...);
             ex) create index emp_ename_idx on emp(ename);

- 함수 기반 Index : 함수값의 결과가 인덱스로 저장됨 (where 절에서 항시 함수의 결과값으로 검색할때)
     ex) create index upper_dept_dname_idx on dept(upper(dname));

- Index 제거 : drop index 인덱스명; ex) drop index upper_dept_dname_idx;


- FlashBack Table : 테이블을 지우면 쓰레기통으로 감.
      ex) drop table t purge;   <-- 쓰레기통(recyclebin)을 거치지 않고 완전 삭제
      ex) flashback table emp2 to before drop;

- 외부 테이블
    ex) > mkdir c:\flat_files
        > copy con c:\flat_filesulcase1.ctl
LOAD DATA
INFILE *
INTO TABLE DEPT
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
(DEPTNO, DNAME, LOC)
BEGINDATA
12,RESEARCH,"SARATOGA"     
10,"ACCOUNTING",CLEVELAND
11,"ART",SALEM
13,FINANCE,"BOSTON"
21,"SALES",PHILA.
22,"SALES",ROCHESTER
42,"INT'L","SAN FRAN"
(ctrl-z)                           <-----------첨부파일 복사해 두어도 됨.

        >cmd.exe /k sqlplus  "/as sysdba"
       
        grant create any directory to scott;

        conn scott/tiger
       
        create directory dept_dir as 'c:flat_files';
        create table dept_external (
           deptno     NUMBER(6),
           dname      VARCHAR2(20),
           loc        VARCHAR2(25)
        )
        ORGANIZATION EXTERNAL
        (TYPE oracle_loader
         DEFAULT DIRECTORY dept_dir
         ACCESS PARAMETERS
         (
         RECORDS DELIMITED BY newline
         BADFILE 'ulcase1.bad'
         DISCARDFILE 'ulcase1.dis'
         LOGFILE 'ulcase1.log'
         SKIP 20
         FIELDS TERMINATED BY ","  OPTIONALLY ENCLOSED BY '"'
         (
         deptno     INTEGER EXTERNAL(6),
         dname      CHAR(20),
         loc        CHAR(25)
          )
         )
         LOCATION ('ulcase1.ctl')
        )
        REJECT LIMIT UNLIMITED;


        select * from dept_external;



( 위 "copy con..."문장대신 아래 .ctl파일을 대신 사용하여도 무방하며, 아래 성경 zip파일을 풀면 csv파일이 들어 있음 이를 기준으로 External테이블을 생성해 볼 것.)


성경.zip
ulcase1.ctl