[Oracle] VIEW
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;