Describe 사용자스키마 here {{{ 사용자 스키마에 대해서... 여기서 사용자 스키마라 하면...사용자가 소유한 오라클의 객체를 의미합니다.. 즉, 테이블, 인덱스, 뷰, 클러스터, 시퀀스, 시노님, 데이타베이스 링크등을 말하고 있습니다.. 이 단원에서는 테이블을 생성하는 방법등 여러 사용자 스키마에 대한 전반적이 내용을 다룰 것입니다.. 지금까지 오라클 스토리지와 관련될 것입니다... 먼저 관계형 데이타베이스의 데이타에 대한 표현 방식인 테이블에 대해서 알아보겠습니다.. 분할등의 약간 고급에 속하는 것들은 따로 다루겠습니다.. 테이블을 만들때는 블록 파라미터와 익스텐트 파라미터 모두 명시할 수 있습니다... 이것을 명시하지 않으면 기본값을 사용하게 됩니다.. 익스텐트는 테이블스페이스를 만들당시 default storage 옵션 절에서 명시한 것을 따르게 됩니다.. 자세한 문법은 메뉴얼을 참고하시구여.. 여기서 못보던 파라미터들이 몇개 눈에 들어옵니다.. CLUSTER, ENALBE/DISABLE, AS 라는 것입니다... 클러스터에 관한것은 클러스터가 나올때 야그하구여.. 활성화/비활성화는 제약조건의 활성화/비활성화를 의미합니다...AS다음에 오는 쿼리문을 통해서.. 새로운 테이블을 만들수 도 있습니다... 그럼...vi에디터를 통해서 테이블을 만들어 보겠습니다.. SQL> !vi $ORACLE_HOME/sample.sql -- dept table create create table yasi.dept( deptno number(2) constraint pk_dept primary key, deptname varchar2(10) not null ) pctfree 20 pctused 50 tablespace users storage (initial 128k next 128k pctincrease 5); -- emp table create create table yasi.emp( empno number constraint pk_emp primary key, ename varchar2(20) not null, job varchar2(20), hiredate date default sysdate, deptno number(2) constraint nn_deptno not null constraint fk_deptno references yasi.dept(deptno) ) pctfree 5 pctused 75 tablespace users storage ( initial 128k next 128k pctincrease 5); ~ ~ ~ ~ ~ ~ ~ ~ :wq SQL> @$ORACLE_HOME/sample.sql 테이블이 생성되었습니다. 테이블이 생성되었습니다. SQL> 중요한것은 이러한 문법들이 아닙니다...테이블을 생성한다는 것은 이미 그 전에 많은 작업이 있었음을 의미합니다.. 현실을 직관적으로 바라보고 이를 최대한 반영하는 것이 테이블 설계자의 목표입니다.. 무턱대고 테이블을 생성해서는 안됍니다... 이것은 그냥 예제로 보인것이구여...암튼...무엇을 데이타화 할 것인가를 고민해야합니다.. 이런것들은 책을 보면 금방 할 수 있는 것들이니까여... 다음은 테이블 수정에 관해서 살펴보겠습니다... 테이블의 수정이라함은 새로운 컬럼을 추가, 제약 사항의 추가 또는 변경, 데이타가 없는 경우는 데이타 타입의 변환도 가능합니다.. 스토리지 옵션도 변경할 수 있습니다... 이미 생성된 컬럼명은 변경할 수 없습니다... 추가적으로 옵션이 몇개가 더 붙습니다.. 기본 문법은 메뉴얼을 참고하시구여.... 추가적인 못보던 스토리지 옵션만 살펴보겠습니다.. ALTER TABLE table [ALLOCATE EXTENT SIZE int[K or M] | DATAFILE 'filename'] [DEALLOCATE UNUSED [KEEP int[K or M]] ] 여기서 ALLOCATE EXTENT의 의미는 기존의 데이타 파일에 새로운 익스텐트를 추가한다는 뜻입니다.. DEALLOCATE UNUSED는 프리 스페이스를 재사용 가능하게 만들어 줍니다..여기에 KEEP 옵션을 더하면 명시한 만큼의 공간은 계속 유지하도록 지정하는 것입니다.. SQL> connect yasi/yasi 연결되었습니다. SQL> alter table emp 2 add (comm number(10), 3 loancode char(1) not null) 4 allocate extent ( size 2M datafile '$ORACLE_HOME/oradata/ORCL/users01.dbf'); <-------수동으로 해당 데이타파일에 익스텐트 추가 테이블이 변경되었습니다. SQL> alter table emp <--------- 컬럼의 데이타형변경과 스토리지 옵션 변경 2 modify (comm number(8), 3 loancode char(1) null) 4 pctfree 20 pctused 50; 테이블이 변경되었습니다. SQL> alter table dept <----------------- 제약조건의 활성화/비활성화 2 disable constraint pk_dept cascade; 테이블이 변경되었습니다. SQL> alter table dept 2 enable primary key; 테이블이 변경되었습니다. SQL> alter table emp 2 enable primary key; 테이블이 변경되었습니다. SQL> create table before_name (id number); 테이블이 생성되었습니다. SQL> insert into before_name values (1); 1 개의 행이 만들어졌습니다. SQL> rename before_name to after_rename; <------------------- 테이블명 바꾸기.. 테이블명이 바뀌었습니다. SQL> select * from after_rename; ID ---------- 1 테이블의 삭제는 drop table table_name으로 수행합니다...아주 쉽습니다... 생각해줘야 할것은 테이블을 삭제해도 그에 딸린 식구덜 까지 모두 삭제가 되는 것은 아닙니다.. 즉, 프로시저라든지 함수, 트리거 같은 것은 지워지지 않습니다.. 그러므로 개발시에 문서화가 상당히 중요하겠지여... 테이블에서 데이타를 삭제할때는 delete나 truncate문을 사용합니다... 주의할 것은 delete는 롤백시킬수 있으나 truncate는 롤백이 되지 않고 자동커밋됩니다.. 테이블에 대해서 너무나도 간단히 알아봤습니다...기초적인 부분은 생략했구여....단지 사용법만을 언급했습니다.. 처음에만 구현이란 것이 어렵지...조금 하다보면 구현이 어려운 것은 아닙니다.. 잘 설계된 것을 실제로 옮기는 작업도 물론 중요하지만..그 전에 많은 노력을 통해 정돈된 것을 옮기는 것이기 때문에.. 당연히 구현할 때도 잘 정돈된 구현상태가 되겠죠... 흠....이 개발에 대해서는 나중에 따로 실제예를 들어서 설명하도록 하겠습니다...지금 건덕지를 찾고 있는데.. 그리 마땅한게 없네여..쩝.. 다음에 인덱스가 있는데...이것은 다른 단원에서 다루겠습니다.. 인덱스는 데이타를 빠르게 가져오기 위한 메카니즘이죠...만약 인덱스가 없었더라면 오라클이 존재하지 않았을 수도 있습니다... 헐헐~ 그만큼 인덱스는 중요합니다... 일단 저런 메카니즘이란 것만 언급하구여... 클러스터를 살펴보겠습니다.. 클러스터 역시 빠른 조회(조인에서)를 위한 저장 메카니즘이기도 합니다... 머...별다른 조치없이 자주 테이블들이 묶여서 조회가 된다면 이 테이블들을 하나의 그룹으로 묶는 것이죠.. 이것은 단지 조회의 잇점을 살리기 위한 메카니즘입니다.. 삽입이나 갱신 같은 작업에는 일반적인 테이블보다 성능이 많이 저하됩니다.. 이런 부가적인 단점에도 불구하고 클러스터는 조회의 성능을 높이기 위해서 사용될 수 있습니다.. 클러스터로 테이블이 묶으면.. 연관된 데이타 행들이 같은 데이타 블록에 저장됨으로 디스크 I/O를 줄여줍니다.. 자칫 잘못 생각하면 클러스터를 하면 저장공간을 더 많이 차지할 꺼라 생각할 수도 있습니다.(저도 그랬어용..) 그러나 클러스터 키는 한번만 인덱스에 저장되기 때문에 중복데이타가 많은 인덱스의 경우 그 공간을 줄여주기도 합니다... 상식으로 생각해 보아도 두개의 테이블 양쪽에 똑같은 컬럼이 외부키로 존재할 수 있습니다..이것이 합쳐져서 한개로 쓴다면.. 오히려 저장공간은 감소합니다... 클러스터는 클러스터된 테이블의 컬럼에 클러스터 키를 가지고 클러스터로 연관된 데이타를 구분합니다.. 클러스터 키는 인덱스를 가지는데 이를 클러스터 인덱스라고 합니다.. 클러스터 키값은 데이타 블록을 직접 포인트하고 있기 때문에 최소 두번의 디스크 입/출력만으로 데이타를 조회할 수 있습니다.. 클러스터 인덱스가 없는 데이타를 조회하지 못하고, 클러스터에 데이타를 저장하기 위해서는 반드시 클러스터 인덱스를 생성해야 합니다.. 정리하자면 클러스터의 생성단계는 다음과 같습니다... 클러스터 생성 --> 클러스터 인덱스 생성 --> 클러스터 테이블 생성 클러스터 생성 문법은 create cluster로 하면 되는데..나머지 옵션들은 사용이 같습니다.. 그러나..한가지 size는 다른 오라클 객체와 좀 다르게 사용됩니다.. 즉, 클러스터에서의 size란 하나의 데이타 블록에 같이 저장될 수 있는 클러스터 키의 총수를 결정짓는 옵션입니다.. 따라서 size의 결정은 클러스터 생성시 가장 신중해야 합니다... 적정선에서 너무 크게도 너무 작게도 설정해주면 안돼겠지여... size가 너무 작게 설정되면 여러 블럭에 걸쳐서 저장되니까 디스크 i/o를 추가적으로 발생시킴으로 성능이 저하될 수 도 있구여.. 너무 크게 잡았다면 저장공간을 낭비하는 꼴이 될 수 있습니다.. 클러스터 인덱스의 문법도 역시 메뉴얼을 참고하시구여... 이제 직접 클러스터링을 해보겠습니다...(주의: 여기서 말하는 클러스터링과 OS에서 말하는 클러스터링을 헤깔리지 마세용~) 위에서 썻던 sample.sql을 사용해 봅시다... 먼저 생성했던 테이블을 삭제하고여... SQL> drop table dept cascade constraints; 테이블이 삭제되었습니다. SQL> drop table emp; 테이블이 삭제되었습니다. SQL> create cluster cluster_dept_emp( <------------- 클러스터 생성 2 deptno number(2) 3 ) 4 size 400 5 tablespace users 6 ; 클러스터가 생성되었습니다. SQL> create index ind_cluster_dept_emp <------------ 클러스터 인덱스 생성 2 on cluster cluster_dept_emp 3 tablespace indx; 인덱스가 생성되었습니다. SQL> @$ORACLE_HOME/sample.sql <-------------- 테이블 생성 테이블이 생성되었습니다. 테이블이 생성되었습니다. 클러스터를 변경할 수 있는 사항들은 클러스터 생성시의 문법에 나온 옵션을 모두 수정할 수 있습니다.. 클러스터를 삭제하면 클러스터에 포함된 모든 테이블과 클러스터인덱스가 함께 삭제됩니다.. 또한 클러스터에 할당되었던 모든 익스텐트는 테이블스페이스로 복구되어 다른 세그먼트에 의해 사용 가능한 상태가 됩니다.. 문법은 다음과 같습니다.. DROP CLUSTER cluster INCLUDING TBLES [CASCADE CONSTRAINTS] 클러스터 삭제시 INCLUDING TBLES 옵션을 주지 않는다면 클러스터를 삭제 할 수 없습니다.. 먼저 해당 테이블을 삭제한 후에 클러스터를 삭제해 주어야 합니다.. 클러스터에 대한 야그는 나중에 나오는 튜닝부분에서 좀더 다루도록 하겠습니다... 다음은 해싱을 살펴보겠습니다.. 오라클에서 말하는 해싱은 테이블의 컬럼으로 해시함수를 제공하고, 그 해시 함수의 결과에 따라 데이타 행을 저장하는 방법을 가리킵니다.. 이러한 해싱은 '=' 조건에서 상당히 빠른 성능을 보장합니다.. 다음은 해싱과 인덱스를 사용하는 경우를 나열한 것입니다.. 해싱사용의 경우 - 테이블의 크기에 변화가 엇는 경우..즉, 데이타의 삭제, 갱신, 입력이 잘 일어나지 않는 경우 - 해시된 컬럼들에 대하여 항상 일정하게 같은 수의 조회가 이루어질때 - 데이타 조회 작업의 성능 최적화가 가장 중요한 요소일때 - 해키 키가 잘 분되어 있을때 인덱스를 사용하는 경우 - 테이블의 크기가 고정적이지 않을 경우 - 해시할 테이블의 크기를 예측할 수 없는 경우 - 저장 공간을 미리 예측하여 할당할 수 없을때 - 응용 프로그램이 테이블 전체 스캔작업을 자주 할때 해쉬에서 문제되는 것은 반환되는 값의 충돌문제입니다... 즉, 내가 원치 않게 해시함수에서 반환된 값이 다른 데이타를 가리킨다면 이것은 문제가 됩니다.. 그러므로 해시값 중에서 데이타 행의 분산을 최대로 제공 할 수 있어야 합니다.. 해시 클러스터의 생성 클러스터 생성 문법에...[HASHKEYS int [HASH IS expr] 이 더해진 문법입니다.. 여기서의 SIZE는 가은 해시 키값으로서 저장되는 모든 데이타 행을 위한 공간의 크기를 지정하며, 그 기본값은 하나의 블록의 크기와 같습니다.. HASHKEYS 에서 지정한 값은 가장 가까운 소수로 변환합니다.. 이값을 100으로 설정한 경우 그 실제의 값은 101이 됩니다.. 이 값의 최소값은 2입니다.. 즉, 오라클의 해수는 소수를 이용한다는 뜻이 되겠죠... 해시클러스터의 크기는 다음과 같은 방법으로 추정할 수 있습니다.. 예를 들면... 블록크기 = 2k PCTFREE = 10 SIZE = 500 HASHKEYS = 40 이라면 블록크기 - PCTFREE = 1800바이트 1800 / 500 = 3 나머지 300 즉, 하나의 블록당 3개의 해시키가 위치할 수 있는 것이고...나머지 300바이트에는 해시키가 위치할 수 없습니다.. 다시말하면 하나의 블록당 3개의 해시키가 위치하고, 4번째 해시키는 다음 블록에 위치하게 되는 것입니다.. 이런 식으로 41개의 해시키가 우치하기 위해서는 14개의 블록이 필요합니다... 마지막 블록에는 4개의 해쉬키만 존해하게 되구여.. 이렇게 된다면 각 블록당 300 바이트의 저장공간의 손실을 보고 있습니다... 그러나 이것은 새로 들어올 행이나 갱신되는 행을 위해서 필요할 수도 있습니다.. 만약 새로 저장되는 데이타 행이 위치할 데이타 블록의 크기보다 클 경우는 오버플로워 데이타 블록이 형성되어 추가적인 디스크 I/O를 유발하여 성능에 영향을 미치게 됩니다.. 만약 해쉬키의 크기를 크게 설정하면 데이타를 저장하기 위한 더 많은 데이타블록이 요구되기 때문에 저장공간의 낭비를 초래할 수 있습니다.. 해쉬클러스터도 클러스터의 한 종류이기 때문에 먼저 클러스터를 생성한 후에 테이블을 생성합니다... 만약 해쉬에 대한 이해를 아직 못하신 분은 아까는 인덱스를 생성해 줬는데...왜 안해줄까 하시는 분덜도 계시리라 생각합니다...이것은 아직 해쉬와 인덱스의 개념이 안잡히셔서 그러니.. 다른 문서나 책을 참고하여 개념을 익히시기 바랍니다... 제가 간단히 말한다면 인덱스와 해쉬는 데이타에 빠르게 접근하기 위한 메카니즘입니다.. 즉, 두개가 서로 다른 메카니즘이죠...그러니 인덱스를 써서 접근할 것인가..아니면 해쉬를 쓸것인가를 결정한 것이죠... 나무꾼이 나무를 하는데 도끼와 톱을 동시에 사용할 수는 없는 노릇이니까여.. SQL> create cluster sn_reserve (sn_number number(4)) 2 tablespace users 3 size 500 4 hashkeys 40 5 hash is sn_number; 클러스터가 생성되었습니다. SQL> create table bookID( 2 sn nuber(4), 3 bookname varchar2(10), 4 salesprise number(9), 5 retailprice number(9), 6 stock number(6) 7 ) 8 cluster sn_reserve(sn); sn nuber(4), * 2행에 오류: ORA-00907: 우괄호가 없습니다 SQL> c sn nuber(4)/sn number(4) SP2-0023: 문자열이 없습니다. SQL> c /sn nuber(4)/sn number(4) 2* sn number(4), SQL> run 1 create table bookID( 2 sn number(4), 3 bookname varchar2(10), 4 salesprise number(9), 5 retailprice number(9), 6 stock number(6) 7 ) 8* cluster sn_reserve(sn) 테이블이 생성되었습니다. SQL> 해쉬클러스터를 변경할 경우 size, hash is, hashkeys의 값은 변경할 수 없습니다.. 그리고 해수 클러스터를 삭제할 경우 해당 테이블과 함께 삭제하려면 including tables 옵션을 설정하면 됩니다.. 여기서 해쉬클러스터에 대한 야그를 마치고, 뷰에 대한 야그를 하겠습니다.. 뷰는 기존의 테이블에서 파생된 또하나의 테이블이라고 보면 됩니다....그러나 실제로 존재하지 않는 테이블입니다.. 즉, 가상 테이브입니다...select에 의해서 나온 결과물을 테이블화 한 것입니다.. 즉, 창문을 통해서 밖을 내다보는 것과 같습니다...테이블을 사용하는 사용자를 우물한 개구리로 만들어 버리는 격이 될 수 있는 것입니다.. 생성문법은 다음과 같습니다.. CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view_name AS subquery [WITH CHECK OPTION [ CONSTRAINT constraint]] [WITH READ ONLY] OR REPLACE는 재생성의 의미를 가지고 있습니다.. FORCE는 실제로 존재하지 않는 테이블에 대해서 강제적으로 뷰를 생성할 때 쓰는 옵션입니다.. WITH CHECK OPTION 을 사용하면 서브쿼리에서 준 조건에 맞는 것만 적용한다는 뜻입니다... 뷰의 사용 목적은 상당히 다양합니다... 뷰를 잘 사용하면 고수라는 소리를 듣는다는 소리가 어쩌면 상당히 활용가치가 있기 때문이 아닌가 합니다.. 사용목적을 살펴봅시당.. - 보안성 : 앞에서도 살펴보았습니다만...사용자를 우물안 개구리가 되게 하는 것입니다... 즉, 눈속임 또는 창을 통해서만 볼 수 있게 함으로써 보안성을 제공하는 것입니다...그러나 그렇게 보안에 좋은 방법은 아니라고 생각합니다...보통 뷰의 이름을 v_titles라든지 하는 원래 테이블의 이름을 암시적으로 알려주고 있어서리...암튼...보안성이 좋기는 하지여.. - 사용상의 편의 : 이것은 개발자가 여러개의 테이블을 조인할 경우 이를 단순화 시킵니다.. 만약 3개의 테이블을 조인하려고 할때...약간은 복잡시렵습니다...이것을 먼저 두개의 테이블을 조인하는 뷰를 만들고...이 뷰와 다른 나머지 하나의 테이블을 조인시킨다면 상당히 단순화 되는 것입니다.. - 수행속도의 향상 : 특정 집합이 먼저 실행되도록 하거나...튜닝이 된 뷰를 생성한다면 수행속도의 향상을 기대할 수 있습니다.. - 융통성 향상 : 이부분은 어케보면 데이타베이스의 좋은 점이라고 볼수 있지여... 즉, 데이타의 독립성을 이야기하는 것입니다...사용자의 관점과 논리적인 부분...물리적인 부분이 독립적이여서.. 데이타 모델이나...객체등이 변하더라도 사용자의 관점..즉, 어플리케이션에는 영향을 미치지 않도록 할 수 있다는 소리지여.. - SQL의 성능향상 :이것은 단순화와도 약간 연관화 되는 소리인데...복잡시련 규칙등을 단순화시키고, 실제로 존재하지 않는 컬럼으로 특정 뷰의 유도 속성으로 만들어서 오버헤드를 줄이고 처리과정을 단순화 시키는 것입니다.. - 임시작업등의 활용에 사용한다면 좋겠죠? 그럼 뷰를 생성하고..옵션을 사용해 봅시다.. SQL> connect scott/tiger 연결되었습니다. SQL> select * from emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 14 개의 행이 선택되었습니다. SQL> create view v_emp 2 as 3 select empno, ename, job, hiredate 4 from emp 5 where deptno = 20; 뷰가 생성되었습니다. SQL> select * from v_emp; EMPNO ENAME JOB HIREDATE ---------- ---------- --------- -------- 7369 SMITH CLERK 80/12/17 7566 JONES MANAGER 81/04/02 7788 SCOTT ANALYST 87/04/19 7876 ADAMS CLERK 87/05/23 7902 FORD ANALYST 81/12/03 SQL> drop view v_emp; 뷰가 삭제되었습니다. SQL> create view v_emp 2 as 3 select empno, ename, job, hiredate, deptno 4 from emp 5 where deptno = 20 6 with check option; 뷰가 생성되었습니다. SQL> select * from v_emp; EMPNO ENAME JOB HIREDATE DEPTNO ---------- ---------- --------- -------- ---------- 7369 SMITH CLERK 80/12/17 20 7566 JONES MANAGER 81/04/02 20 7788 SCOTT ANALYST 87/04/19 20 7876 ADAMS CLERK 87/05/23 20 7902 FORD ANALYST 81/12/03 20 6 개의 행이 선택되었습니다. SQL> insert into v_emp values (7777, 'YASI', 'CLERK', sysdate, 20); 1 개의 행이 만들어졌습니다. SQL> select * from v_emp; EMPNO ENAME JOB HIREDATE DEPTNO ---------- ---------- --------- -------- ---------- 7369 SMITH CLERK 80/12/17 20 7566 JONES MANAGER 81/04/02 20 7788 SCOTT ANALYST 87/04/19 20 7876 ADAMS CLERK 87/05/23 20 7902 FORD ANALYST 81/12/03 20 7777 YASI CLERK 01/12/10 20 6 개의 행이 선택되었습니다. SQL> update v_emp 2 set job = 'MANAGER' 3 where empno = 7777; 1 행이 갱신되었습니다. SQL> select * from v_emp; EMPNO ENAME JOB HIREDATE DEPTNO ---------- ---------- --------- -------- ---------- 7369 SMITH CLERK 80/12/17 20 7566 JONES MANAGER 81/04/02 20 7788 SCOTT ANALYST 87/04/19 20 7876 ADAMS CLERK 87/05/23 20 7902 FORD ANALYST 81/12/03 20 7777 YASI MANAGER 01/12/10 20 6 개의 행이 선택되었습니다. SQL> select * from emp 2 where empno = 7777; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7777 YASI MANAGER 01/12/10 20 SQL> insert into v_emp values (8888, 'LEE', 'CLERK', sysdate, 30); insert into v_emp values (8888, 'LEE', 'CLERK', sysdate, 30) * 1행에 오류: ORA-01402: 뷰의 WITH CHECK OPTION의 조건에 위배 됩니다 SQL> create view v2_emp 2 as 3 select * from emp 4 order by empno; <---------- 오라클8.x버전에서는 order by 절을 사용할 수 없었으나, 8i 버전 이상에서는 가능해졌습니다.. 뷰가 생성되었습니다. SQL> alter view v2_emp compile; <------- 보통 뷰의 변경은 뷰의 재컴파일시 사용된다.. 뷰가 변경되었습니다. 다음은 뷰에 대한 데이타사전뷰입니다.. USER_VIEWS ALL_VIEWS DBA_VIEWS 뷰의 사용은 이정도로 마치고...나중에 SQL부분에서 뷰를 써먹는 경우를 살펴보겠습니다...(저는 개인적으로 뷰를 상당히 좋아합니당..) 다음으로 시퀀스를 살펴봅시다.. 시퀀스를 생성하면 '주문번호가 생성되었습니다'라는 메세지가 나옵니다... 시퀀스는 일련번호를 생성하는 그런 것입니다.. 문법은 메뉴얼 참고하시구여...여기서는 주의해야할 옵션 몇개만 살펴보겠습니다.. 우선 MAXVLAUE/NOMAXVALUE가 잇는데...이 옵션은 시퀀스가 증가 될 수 있는 최대값을 나타냅니다.. MAXVALUE의 기본값은 1024입니다...NOMAXVALUE로 설정하면 무한대로 값이 올라가게 됩니다.. CYCLE이란 옵션이 있는데...이것은 시퀀스의 최대값에 도달하면 그 다음값으로 최초의 값이 되는 것입니다.. 기본값은 순환하는 값이 아닙니다... CACHE/NOCACHE라는 옵션이 있는데...이것은 캐시를 사용하도록 지정하는 것입니다... 이값을 지정하지 않으면 기본적으로 오라클은 20개의 값을 캐시합니다.. 시퀀스 생성을 해보겠습니다.. SQL> create sequence seq_iii 2 increament by 1 3 start with 50 4 maxvalue 100 5 nocache 6 nocycle; increament by 1 * 2행에 오류: ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다 SQL> c /increament by 1/increment by 1 2* increment by 1 SQL> run 1 create sequence seq_iii 2 increment by 1 3 start with 50 4 maxvalue 100 5 nocache 6* nocycle 주문번호가 생성되었습니다. SQL> select seq_iii.nextval from dual; NEXTVAL ---------- 50 SQL> select seq_iii.currval from dual; CURRVAL ---------- 50 SQL> create table seq_test (id number); 테이블이 생성되었습니다. SQL> create table seq_test (id number); 테이블이 생성되었습니다. SQL> insert into seq_test values (seq_iii.nextval); 1 개의 행이 만들어졌습니다. SQL> select * from seq_test; ID ---------- 51 시퀀스의 변경은 모두 생성문법과 같은데 start with문이 없다는 것 뿐입니다... 즉, 이미 생성당시 시작할 시퀀스의 값이 정해졌기 때문입니다.. 삭제는 drop sequence sequence_name 을 하시면 됩니다.. 다음은 시노님에 대해서 살펴보겠습니다.. 시노님은 오라클 객체에 대한 별칭을 제공하는 것입니다... 즉, 원격 데이타베이스나 아니면 다른 사용자의 객체를 참조할때의 투명성을 확보해 줍니다... 다음의 예를 보면 yasi사용자가 scott 사용자의 소유인 emp테이블을 조회할 때 scott.emp라고 표시합니다.. SQL> select * from scott.emp; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 7777 YASI MANAGER 01/12/10 20 15 개의 행이 선택되었습니다. 이렇듯 좀 불편하기도 하지여...항상 자신이 쓰려는 객체의 소유자를 알고 있어야 하니 말이죠... 이것을 시노님을 생성하면 간단히 소유자를 알지않고 있어도 어떤 객체를 쓸 것인지만 알면 됩니다.. 동의어(시노님)을 생성해 봅시다.. SQL> create synonym emp for scott.emp; create synonym emp for scott.emp * 1행에 오류: ORA-01471: 객체와 같은 이름의 동의어는 작성할 수 없습니다 SQL> create synonym employee for scott.emp; 동의어가 생성되었습니다. SQL> select * from employee; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 7777 YASI MANAGER 01/12/10 20 15 개의 행이 선택되었습니다. SQL> connect scott/tiger <------------------------------------------------------ 소유자이므로 yasi사용자가 생성한 scott.emp 시노님이 적용된다.. 연결되었습니다. SQL> select * from employee; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 7777 YASI MANAGER 01/12/10 20 15 개의 행이 선택되었습니다. SQL> connect system/manager 연결되었습니다. SQL> select * from employee; select * from employee * 1행에 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 <--------------- 즉, 위에서 생성한 시노님은 지역적이라는 것을 알수 있다.. SQL> connect yasi/yasi 연결되었습니다. SQL> create public synonym employee for scott.emp; create public synonym employee for scott.emp * 1행에 오류: ORA-01031: 권한이 불충분합니다 <-------------- 공용(public) 시노님은 dba가 생성해야 한다.. SQL> connect system/manager 연결되었습니다. SQL> create public synonym employee for scott.emp; 동의어가 생성되었습니다. SQL> select * from employee; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- ---------- --------- ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 7777 YASI MANAGER 01/12/10 20 15 개의 행이 선택되었습니다. 이제 마지막으로 사용자 스키마에서 살펴볼 것은 데이타베이스 링크입니다.. 데이타베이스 링크는 컴터가 두대 있어야지 실습이 가능합니다...물론 네트웍 환경도 셋팅이 되어 있는 상태여야 하구여... 저는 컴터가 두대라서리 할수 있지만....이거 보시는 분덜은 어떨지 몰겠습니다.. 흠...저는 첨에 이거 오라클 NET8설정하는데....무지 고생했습니다..... 하루죙일 이것만 쳐다보구 있었지여... 암튼....이렇게 서비스이름을 지정한 것을 @와 더불어 붙여줍니다.. SQL> connect scott/tiger 연결되었습니다. SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production <---------- 유닉스 서버의 오라클 8.1.7 입니다.. PL/SQL Release 8.1.7.0.0 - Production CORE 8.1.7.0.0 Production TNS for Intel SVR4 UNIX: Version 8.1.7.0.0 - Development NLSRTL Version 3.4.1.0.0 - Production SQL> connect scott/tiger@ORCL 연결되었습니다. SQL> select * from v$version; BANNER ----------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.0.1.1.1 - Production <----------- 윈2000 서버의 오라클 9.0.1.1.1 입니다.. PL/SQL Release 9.0.1.1.1 - Production CORE 9.0.1.1.1 Production TNS for 32-bit Windows: Version 9.0.1.1.0 - Production NLSRTL Version 9.0.1.1.1 - Production 우리는 데이타베이스에 작업을 할때 이런식으로 작업을 하게 됩니다... 이것은 상당히 불편하지여...그래서 튀어나온 것이 데이타베이스 링크입니다.. 사용자에게 상당한 투명성을 확보합니다... 즉, 데이타베이스 링크는 데이타베이스 서버로의 네트웍 연결을 위한 대체명이라고 할 수 있습니다.. 다음은 데이타베이스 링크의 문법입니다... CREATE [PUBLIC] DATABASE LINK link CONNECT TO username IDENTIFIED BY passwd Using service_name 직접 해봅시다.. SQL> create database link yasicom2001_Server 2 connect to scott identified by tiger 3 using 'ORCL'; 데이타베이스 링크가 생성되었습니다. SQL> select * from emp@yasicom2001_Server; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO ---------- -------------------- ------------------ ---------- -------- ---------- ---------- ---------- 7369 SMITH CLERK 7902 80/12/17 800 20 7499 ALLEN SALESMAN 7698 81/02/20 1600 300 30 7521 WARD SALESMAN 7698 81/02/22 1250 500 30 7566 JONES MANAGER 7839 81/04/02 2975 20 7654 MARTIN SALESMAN 7698 81/09/28 1250 1400 30 7698 BLAKE MANAGER 7839 81/05/01 2850 30 7782 CLARK MANAGER 7839 81/06/09 2450 10 7788 SCOTT ANALYST 7566 87/04/19 3000 20 7839 KING PRESIDENT 81/11/17 5000 10 7844 TURNER SALESMAN 7698 81/09/08 1500 0 30 7876 ADAMS CLERK 7788 87/05/23 1100 20 7900 JAMES CLERK 7698 81/12/03 950 30 7902 FORD ANALYST 7566 81/12/03 3000 20 7934 MILLER CLERK 7782 82/01/23 1300 10 14 개의 행이 선택되었습니다. SQL> drop database link yasicom2001_Server; <--------- 삭제는 간단합니다.. 데이타베이스 링크가 삭제되었습니다. 여기까지 사용자 스키마에 대해서 다루어 봤습니다..... 아직도 해야될 내용이 무궁무진 합니다.... 머리가 지끈거리네여....지금이 새벽4시군여....헐헐~ }}}