일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- querydsl
- 이진탐색
- exclusive lock
- 일대다
- dfs
- 연관관계
- execute
- 다대일
- SQL프로그래밍
- fetch
- 스프링 폼
- 데코레이터
- 힙
- BOJ
- 연결리스트
- 지연로딩
- 백트래킹
- 스토어드 프로시저
- PS
- 낙관적락
- shared lock
- CHECK OPTION
- 비관적락
- eager
- JPQL
- FetchType
- 동적sql
- 유니크제약조건
- 다대다
- 즉시로딩
- Today
- Total
흰 스타렉스에서 내가 내리지
[SQL] 뷰 :: VIEW 본문
뷰는 테이블처럼 데이터를 가지고 있지는 않다.
뷰의 실체는 SELECT 문으로 만들어져 있기 때문에, 뷰에 접근하는 순간 SELECT 가 실행되고 그 결과가 화면에 출력되는 방식이다.
비유하자면 바탕화면의 '바로 가기 아이콘' 과 비슷하다.
- 뷰를 만드는 형식
CREATE VIEW 뷰_이름
AS
SELECT ~~;
CREATE VIEW v_member
AS
SELECT mem_id, mem_name, addr FROM member;
뷰는 기본적으로 '읽기 전용' 으로 사용되지만, 뷰를 통해서 원본 테이블의 데이터를 수정할 수도 있다.
# 뷰를 사용하는 이유
보안에 도움이 된다
예시 : 아르바이트생에게 회원 조회 작업을 시킨다.
그런데 아르바이트생이 회원 테이블에 접근할 수 있도록 한다면 중요한 개인 정보까지 모두 노출될 수 있다.
그렇다고 회원 테이블에 접근하지 못하게 하면 일을 진행할 수가 없다.
이런 경우, 이름, 주소만 보이는 뷰(v_member) 를 생성해서 아르바이트생은 회원 테이블에 접근하지 못하도록 권한을 제어하고, 뷰에만 접근할 수 있도록 권한을 준다면 이러한 문제를 쉽게 해결할 수 있다.
----------데이터베이스 보안
- 우리는 MySQL 워크벤치를 실행할 때 계속 root 사용자로 접속했다.
- root 사용자는 모든 권한이 있는 관리자로 못하는 작업이 없다.
- 회사에서, 직원의 등급에 따라 고객 정보에 접근할 수 있는 권한을 차등해서 부여하는 식으로 사용될 수 있다.
-----------
복잡한 SQL 을 단순하게 만들 수 있다.
CREATE VIEW myview
AS
SELECT ~~~
FROM ~~
INNER JOIN ~~
ON ~~~
;
길고 복잡한 쿼리가 있다.
만약 이 쿼리를 자주 사용해야 한다면, 사용자들은 매번 위와 같은 복잡한 쿼리를 입력해야 할 것이다.
그런데 이 SQL 을 위와 같이 뷰로 생성해놓고 사용자들은 해당 뷰에만 접근하도록 하면 복잡한 SQL 을 입력할 필요가 없어진다.
SELECT * FROM myview WHERE ~~~;
# 뷰의 수정
뷰의 수정은 ALTER VIEW 구문을 사용한다.
ALTER VIEW myview
AS
SELECT ~~~
;
# 뷰의 삭제
DROP VIEW myview;
# 뷰 덮어쓰기
CREATE OR REPLACE VIEW myview
AS
SELECT ~~~ ;
- 뷰를 생성할 때 CREATE VIEW 는 기존에 뷰가 있으면 오류가 발생하지만, CREATE OR REPLACE VIEW 는 기존에 뷰가 있어도 덮어쓰는 효과를 내기 때문에 오류가 발생하지 않는다.
- 즉, DROP VIEW 와 CREATE VIEW 를 연속으로 작성한 효과를 갖는다.
# 뷰를 통한 데이터의 수정/삭제
- 뷰를 통해서 테이블의 데이터를 수정할 수 있다.
UPDATE myview SET addr = '부산'; -- OK
---
INSERT INTO myview (mem_id) VALUES(1); -- ERROR!
-- Error Code: 1423. Field of view 'myview' underlying table doesn't have a default value
- my_view 가 참조하는 member 테이블의 열 중에서 하나가 NOT NULL 로 설정되어 있어서 반드시 입력해줘야 한다.
- 하지만 myview 는 그 열을 참조하고 있지 않아서 값을 입력할 방법이 없다.
- 만약 myview 뷰를 통해서 member 테이블에 값을 입력하고 싶다면 myview 에 해당 열을 포함하도록 뷰를 재정의하거나, member 열의 속성을 NULL 로 바꾸거나, default 로 지정해야 한다.
- 뷰를 통해서 데이터를 입력하려면, 뷰에서 보이지 않는 테이블의 열에 NOT NULL 이 없어야 한다.
# WITH CHECK OPTION
- 키가 167 이상인 회원을 조회하는 뷰를 생성한다.
CREATE VIEW v_height167
AS
SELECT * FROM member WHERE height >= 167;
SELECT * FROM v_height167;
- v_height167 뷰에서 키가 167 미만인 데이터를 삭제해 본다.
DELETE FROM v_height167 WHERE height < 167;
-- 0 row(s) affected
당연히 v_height167 뷰에는 167 미만인 데이터가 없다.
따라서 삭제될 데이터도 없다
- 이번에는 v_height167 뷰에서 키가 167 미만인 데이터를 입력해본다
INSERT INTO v_height167 VALUES('TRA', ..., 159);
-- 1 row(s) affected
입력을 되었으나, 이상하다.
v_height167 뷰는 167 이상만 보이도록 만든 뷰인데, 167 미만인 데이터가 들어갔다.
SELECT 쿼리를 실행해보면, 역시나 167 이상만 조회되므로, 방금 전에 입력한 159의 데이터는 보이지 않는다.
키가 167 이상인 뷰이므로 167 이상의 데이터만 입력되도록 하는 것이 논리적으로 바람직해 보인다.
이럴 때 예약어 WITH CHECK OPTION 을 통해 뷰에 설정된 값의 범위가 벗어나는 값은 입력되지 않도록 할 수 있다.
ALTER VIEW v_height167
AS
SELECT * FROM member WHERE height >= 167
WITH CHECK OPTION;
--
INSERT INRO v_height167 VALUES (~~~, 159); -- ERROR!
-- ERROR Code: 1369. CHECK OPTION failed 'v_height167'
이제 167 미만인 데이터는 입력되지 않고, 167 이상의 데이터만 입력된다.
# 단순 뷰와 복합 뷰
- 하나의 테이블로 만든 뷰를 단순 뷰라 하고, 두 개 이상의 테이블로 만든 뷰를 복합 뷰라고 한다.
- 복합 쥬는 주로 두 테이블을 조인한 결과를 뷰로 만들 때 사용한다.
- 복합 뷰의 예는 아래와 같다.
CREATE VIEW v_complex
AS
SELECT B.id, M.id
FROM buy B
INNER JOIN member M
ON B.id = M.id;
- 복합 뷰는 읽기 전용이다.
- 복합 뷰를 통해 테이블에 데이터를 입력/수정/삭제할 수 없다.
+ 테이블은, 뷰가 참조하고 있어도 삭제된다.
'SQL' 카테고리의 다른 글
[SQL] 기본값 정의 (0) | 2024.04.15 |
---|---|
[SQL] 체크 제약 조건 (0) | 2024.04.15 |
SQL 프로그래밍 - 스토어드 프로시저, IF, CASE, WHILE, 동적 SQL (0) | 2024.04.11 |
내부 조인과 외부 조인 (0) | 2024.04.10 |
[SQL] 데이터 형 변환 - 명시적인 변환 (0) | 2024.04.10 |