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모드 해제
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);
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테이블을 생성해 볼 것.)
- deferred 사용시 장점 : 키가 되는 데이터를 나중에 입력해도 됨.
주의 : 하나라도 실패하면 모두 롤백됨.
SQL> alter table emp2
add constraint emp2_dept_fd
foreign key(deptno)
references dept(deptno)
deferrable initially deferred;
SQL> alter session set constraints = deferred;
세션이 변경되었습니다.
SQL> insert into emp2(empno,deptno) values (1,11);
1 개의 행이 만들어졌습니다.
SQL> insert into dept values(11,'aaa','aaa');
1 개의 행이 만들어졌습니다.
SQL> commit;
커밋이 완료되었습니다.
SQL>
- exceptions 테이블 사용법 : disalbe된 제약조건을 enable로 바꿀때..
SQL> @E:oracleproduct10.2.0db_1RDBMSADMINutlexcpt.sql
테이블이 생성되었습니다.
SQL> r
1 alter table emp2
2 enable constraint emp2_dept_fd
3* exceptions into exceptions
enable constraint emp2_dept_fd
*
2행에 오류:
ORA-02298: 제약 (SCOTT.EMP2_DEPT_FD)을 사용 가능하게 할 수 없음 - 부모 키가
없습니다
SQL> select * from exceptions
2 /
ROW_ID OWNER TABLE_NAME
------------------ ------------------------------ ------------------------------
CONSTRAINT
------------------------------
AAAM1EAAEAAAAHIAAC SCOTT EMP2
EMP2_DEPT_FD
SQL> select * from emp2 where rowid=AAAM1EAAEAAAAHIAAC
2 /
select * from emp2 where rowid=AAAM1EAAEAAAAHIAAC
*
1행에 오류:
ORA-00904: "AAAM1EAAEAAAAHIAAC": 부적합한 식별자
SQL> select * from emp2 where rowid='AAAM1EAAEAAAAHIAAC'
2 /
EMPNO ENAME JOB DEPTNO
---------- ---------- --------- ----------
2 13
SQL> ed
file afiedt.buf(이)가 기록되었습니다
1 delete from emp2 where rowid in (
2 select row_id from exceptions where table_name='EMP2'
3* )
SQL> r
1 delete from emp2 where rowid in (
2 select row_id from exceptions where table_name='EMP2'
3* )
1 행이 삭제되었습니다.
SQL> alter table emp2
2 enable constraint emp2_dept_fd;
테이블이 변경되었습니다.
SQL>



-ora-00054에러 발생할수 있다. lock이 걸려 있음.
- 해결 방법 :
1. 아래 질의를 쳐서 테이블 락을 유발한 사용자(commit을 아직 내리지 안니한)가 누군지찾는다.
select a.sid, a.serial#,un.username
from
v$session a,
v$lock b,
dba_objects c,
dba_users un
where a.sid=b.sid
and b.id1=c.object_id
and a.user#=un.user_id
and b.type='TM'
and c.object_name='X';
SID SERIAL# USERNAME
---------- ---------- ------------------------------
153 3817 SCOTT
2. 연락 가능한 사용자 이면 그 사용자에게 연락 하거나 세션을 kill해 준다.
alter system kill session '153, 3817';