SQL

[Oracle] VIEW

ㄷㅐ장님 2022. 1. 5. 01:25

select * from user_sys_privs;  ① dba(sys)로부터 직접받은 시스템권한 확인
select * from role_sys_privs;  ② dba(sys)로부터 role을 통해서 받은 시스템권한 확인
select * from session_privs;   오라클에 로그인 할 때 내가 받은 시스템권한 확인(①+②)
select * from user_ts_quotas;  dba(sys)로부터 받은 특정한 테이블스페이스 사용할 수 있는 정보

view

: 하나 이상의 테이블이 있는 데이터를 논리적으로 처리하는 object.

-단지 select문만 가지고 있는 객체이다.

-간접 access(직접 데이터가 있는 테이블을 access 하는 게 아니라 view를 통해서 테이블을 참조한다)

-뷰를 생성하려면 create view 시스템권한이 있어야 한다.

-함수, 표현식을 사용했으면 별칭 필수!

 

view를 사용하는 이유

create table copy_emp
as select employee_id,last_name,email,job_id,department_id
from employees;
테이블 두개(copy_emp,employees)에 같은 컬럼이 있어서 하나 수정할때마다 따로따로 수정해야함
=> 유지관리에 비효율적!!


view 생성

create view emp_view
as select employee_id, last_name, email, job_id, department_id
from employees;

emp_view select 하는 순간 뷰 생성시 만들었던 select문이 내부적으로 수행된다.
    
view 확인

select * from emp_view; --emp_view가 table인지 view인지 어케 앎?
select * from user_objects where object_name in ('EMPLOYEES','EMP_VIEW'); --이걸로 확인


view 수정
or place : 기존이름으로 view가 있으면 drop하고 create 하는 옵션

create or replace view emp_view
as select employee_id, last_name || ' ' || first_name name, email, department_id 
from employees;

 

단순뷰

: view 안의 select문에 테이블이 하나만 있는 경우, 즉 조인문장이 없는 경우

-함수를 사용하지 않는 경우

-view를 통해서 dml작업을 수행할 수 있다.

create or replace view test_view
as select * from test;

 

복합뷰

: view 안의 select문에 table을 여러개 사용한 경우, 즉 조인문장이 있는 경우

-함수를 사용한 경우

-view를 통해서 dml작업을 수행할 수 없다. (조인문장이 없는 경우에만 delete 가능)

 

with read only

: 단순뷰에서 dml작업을 수행할 수 없도록 하기위한 옵션, 즉 select만 가능하도록 만들때 사용.

create or replace view test_view as select * from test with read only;

with check option

: 뷰에서 check 제약조건을 생성하는 옵션

check 제약조건 식 : 뷰생성시 select문의 where절에 있는 내용이 check 제약조건식이 된다.

create or replace view test_view
as select * from test
where dept_id = 20 --check 제약조건의 식
with check option constraint test_view_dept_20_ck; --check 제약조건 생성/이름설정

⇒ test_view를 통해서 20번부서 정보만 신규데이터로 입력해야한다.

 

insert into test_view(id,name,sal,dept_id) values(300,'홍길동',1000,10); --오류:check 제약조건 위배
insert into test_view(id,name,sal,dept_id) values(300,'홍길동',1000,20); --insert가능

⇒ test_view를 통해서는 20번이 아닌 다른 부서로 수정할 수 없다. dept_id가 아닌 다른 컬럼의 값은 수정가능


[문제102] 부서이름별, 총액급여, 평균급여를 access하는 dept_sum_sal 뷰를 생성해주세요.

create or replace view dept_sum_sal
as
select d.department_name, e.sumsal, e.avgsal
from (select department_id, sum(salary) sumsal, avg(salary) avgsal
        from employees
        group by department_id) e, departments d
where e.department_id = d.department_id;