개발/database

[DB] View

yun000 2024. 12. 18. 16:31

<VIEW>

=테이블또는 다른 뷰를 기초로 하는 논리적 테이블

view는 USER_VIEWS 딕셔너리에 저장된다. (select * from USER_VIEWS;)

사용 목적

1. 접근제한을 통한 자동 보안이 제공

→ 일부 정보를 공유할 때 테이블 자체에 읽기 권한을 준다면 모든 행, 열이 조회가 된다.(보안 취약)

view는 테이블의 일부 행, 열로 만들 수 있는데

이렇게 정의한 view만 공유한다면 자동으로 보안이 제공된다

 

2. join구문을 이용하여 view를 만들고

그 데이터로 부터 조회를 하면 훨씬 더 편리한다.

 

3. 같은 데이터를 다른 뷰로 나타낼 수 있으므로

같은 데이터에 대해 동시에 여러 사용자의 다른 응용프로그램 요구를 지원

 

단순 뷰, 복합 뷰

특징 단순뷰 복합뷰
테이블 수 1 2이상
함수 포함 X O
데이터 그룹 포함 X O
뷰를 통한 DML O X

 

<뷰 생성, 데이터 검색, 수정, 삭제>

뷰 생성 권한

=뷰 생성 권한이 있어야 뷰 생성 가능

 

USERS_ROLE로 뷰 생성권한 확인 가능

select * from user_role_privs;

 

USER_SYS_PRIVS사용자가에게 주어진 권한 조회

select * from user_sys_privs;

 

뷰 생성

=create view로 서브 쿼리 작성

--create view
create view emp_view_dept60
as select employee_id, first_name, last_name, job_id, salary
from employees
where department_id=60;

--check view
desc emp_view_dept60;

 

뷰 생성 서브쿼리에서 별칭 사용

=서브 쿼리에서 열 별칭으로 열 이름 제어할 수 있다.

 

예제

employee_id → empno

first_name+last_name → name

salary → monthly_salary

로 명칭을 변경한다.

create view emp_dept60_salary (empno, name, monthly_salary)
as select
	employee_id,
        first_name||' '|| last_name,
        salary
from employees,
where department_id=60;

 

뷰 질의

=뷰로부터 데이터 검색 가능

전체 뷰 내용 디스플레이 하거나, 특정 행과 열만 볼 수 있다

뷰 생성되면 뷰이름, 뷰정의를 보기 위해 USER_VIEWS(데이터 딕셔너리 테이블)을 질의할 수 있다.

 

뷰 수정

=or replace로 수정할 수 있다.

or replace를 추가하면 해당이름의 뷰가 이미 존재해도 뷰가 생성될 수 있게 해준다.

create or replace view 뷰이름....

create or replace view emp_dept60_salary
as select
	employee_id as empno,
    first_name||' ' ||last_name as name,
    job_id as job,
    salary
from employees
where edpartment_id=60;

 

복합 뷰 생성

두 개 이상 테이블 이용해서 뷰 생성

create view emp_view
as select
        e.employee_id as id,
        e.first_name as name, 
        d.department_name as department,
        j.job_title as job
    from employees e
    left join departments d on e.department_id=d.department_id
    join jobs j on e.job_id=j.job_id;

뷰 삭제

=데이터 손실 없이 뷰를 삭제할 수 있다.

뷰를 만든 사람이나 drop any view권한을 가진 사람만 뷰를 제거할 수 있다.

drop view 뷰이름;

 

<뷰를 이용한 DML 연산>

뷰에서 DML연산 실행 규칙

- 단순 뷰 - DML연산 수행 가능

- 뷰가 group by, 그룹 함수, distince를 포함하면 행 제거 불가

- 뷰가 rownum, 표현식으로 정의된 열, 위의 행 제거할 수 없는 조건 가지면 데이터 수정할 수 없다

- 뷰가 위의 행 제거와 수정할 수 없는 조건, 뷰에 의해 선택되지 않은 not null열이 기본 테이블에 있으면 데이터 추가 불가

 

1. 삭제가 안될 때

뷰가 다음을 포함하면 행 제거 불가(수정, 입력도 불가)

    그룹 함수

     group by 절

     distince 키워드

 

ex)안되는 경우

create or replace view emp_dept60
as select distinct * from emps where department_id=60;

 

2. 수정이 안되는 경우

뷰가 다음을 포함하면 데이터 수정 불가(입력도 불가)

    행 제거 할 수 없는 조건

    표현식으로 정의된 열

    rownum 의사열

 

ex) 안되는 경우

create or replace view emp_dept60
as select employee_id, first_name ||', '||last_name as name, salary*12 as anuunal_salary
from emps where department_id=60;

 

3. 입력이 안되는 경우

뷰가 다음을 포함하면 데이터 추가 불가

    행 제거할 수 없는 조건과 행 수정할 수 없는 조건

    뷰에 의해 선택되지 않은 not null 열이 기본 테이블에 있을 때

 

With Check Option

뷰에 의해 액세스 가능한 행만이 삽입 갱신될 수 있다.

→ 무결성 제약조건과 데이터 검증 체크 가능.

With Read Only

=뷰에서 수행할 수 있는 DML작업이 없음을 확실히 하는 것.

=view를 만들때는 뒤에 with read only를 넣어주는 것이 좋다

create or replace view emp_dept60
as select employee_id, first_name, hire_date, salary, department_id
from emps
where department_id=60
with read only;

<INLINE VIEW>

from절에 서브쿼리가 있는 것

서브쿼리를 from절에 사용해 하나의 테이블 또는 뷰처럼 사용할 수 있다.

뷰도 하나의 독립적인 select문이므로 from절에 사용하는 서브쿼리도 하나의 뷰로 볼 수 있다.

그래서 from 절에 오는 뷰를 인라인 뷰라고 한다.

 SELECT	row_number, first_name, salary
FROM (SELECT first_name, salary, row_number() OVER (ORDER BY salary DESC) AS row_number							
FROM employees)
WHERE row_number BETWEEN 1 AND 10;