
--권한은 시스템이 만들어야
--필요할때마다 실행하고 결과를 보여준다.
--2테이블-3개 속성 하나 테이블로 만들고 싶어->뷰-> 메모리에 저장하지 않는다
--물리적인 존재 안 함
--가상 테이블
--실제로 데이터를 저장하지 않고 퀴리문만 저장한다.
--테이블 삭제
drop table emp_copy;
create table emp_copy
as select * from emp;
select * from emp_copy;
--뷰 생성 --에러(뷰 생성 권한이 없음 -insufficient privileges)
create view emp_view_dept30
as
select empno,ename,deptno
from emp_copy
where deptno=30;
--sys 가 학번에게 뷰 생성 권한을 부여-->system에서 뷰 권한을 줌.
conn system
-->system 접속->계정 바꿔
grant create view to s학번;
--user:system
--password:manager
--권한을 취소할때
revoke create view to s학번;
--자기 계정으로 접속
conn s학번;
--pw:tiger;
--뷰 데이터 사전 조회
desc user_views;
--viewname, text, readonly주의
--
select view_name, text, read_only
from user_views
where view_name in ('EMP_VIEW_DEPT30');
select *
from emp_view_dept30;
--실제 존재하지 않다
--위에(
--create view emp_view_dept30
--as
--select empno,ename,deptno
--from emp_copy
--where deptno=30;) 돌면서 실행 결과를(select *
--from emp_view_dept30;)에 넣어 줌
select empno, ename, dname
from emp_copy, dept
where emp_copy.deptno=dept.deptno
and dname ='SALES';
create view emp_view_sales
as
select empno, ename, dname
from emp_copy, dept
where emp_copy.deptno=dept.deptno
and dname ='SALES';
select * from emp_view_sales;
select empno, ename, dname
from emp, dept
where dname='SALES'
and dept.deptno =emp.deptno
and ename like 'A%';
select empno, ename, dname
from emp_view_sales
where ename like 'A%';
--뷰에 데이터가 변화가 생김년 기분 테이블에는 똑 같은 변화가 생긴다.(동기화)
--이 뷰의 기본 테이블은 emp_copy(base table)
insert into emp_view_dept30
values(1111,'park',30);
select *
from emp_view_dept30;
desc emp_view_dept30;
select * from emp_copy;
--작성한 뷰 확인
select view_name, text, read_only
from user_views;
--뷰 삭제
drop view 뷰이름;
--or replace 옵션
--뷰를 생성하거나 존재하는 경우 변격시키는 옵션
--emp_view_dept30 을 변경
create or replace view emp_view_dept30
as
select empno, ename, sal, comm, deptno
from emp_copy
where deptno=30;
--뷰가 없으면 새거만들고 이미 있으며 덮어쓰다
--뷰 확인
desc emp_view_dept30;
--with check option: 조건의 컬럼값을 뷰를 통해 **변경하지
--못하게** 하는 옵션
--(where절의 내용만 변경 못해게 함. 다른 필드 값 변경은 가능)...
--테이블 생성
create table emp_copy2
as
select * from emp_copy;
--부서번호가 30인 사원의 정보 검색하는 뷰(with check option)
create or replace view view_chk30
as
select empno, ename, sal, comm, deptno
from emp_copy2
where deptno = 30
with check option;
select * from view_chk30;
--급여가 1200 이상인 사원의 부서번호를 20으로 변경하기
--에러 : view WITH CHECK OPTION where-clause violation
--with check option는 where 절의 내용을 변경 못하게 함
--where 절의 필드명 변경은 금지, 다른 값을 변경 가능
--X
update view_chk30
set deptno=20
where sal > 1200;
--O
update view_chk30
set comm=200
where sal > 1200;
select * from view_chk30;
**--with read only 옵션 가진 뷰정의
--with read only 옵션은 내용을 변경은 금지
**
create or replace view view_read30
as
select empno, ename, sal, comm, deptno
from emp_copy2
where deptno=30
with read only;
--부를 수정
--에러: cannot perform a DML operation on a read-only view
--에러(with read only이므로 변경 안됨)
**update view_read30
set comm=2000;
**
1. 부서별 최대 급여와 최소 급여를 출력하는 뷰를 작성하라.
create or replace view view_sal
as
select d.dname, max(e.sal) as max_sal, min(e.sal) as min_sal
from emp_copy e, dept d
where e.deptno = d.deptno
group by d.dname;