SQL 11-4. 뷰를 통한 DML 작업 수행에 관한 규칙
관련링크
본문
DML 작업이 특정 규칙을 따르는 경우 뷰를 통해 데이터에 대한 DML 작업을 수행할 수 있다.
① 뷰가 다음을 포함하는 경우 행을 제거할 수 없다.
․ 그룹 함수
MSSQL 디비 예제
--// 두 테이블을 조인해서 만든 뷰에서의 삭제와 수정
create table viewupd1
(
c1 int primary key,
c2 int
)
create table viewupd2
(
c1 int primary key,
c3 int
)
insert viewupd1 values(1,1)
insert viewupd2 values(1,1)
․ GROUP BY절
․ DISTINCT 키워드
․ 의사 열 ROWNUM 키워드
② 뷰에 다음이 포함된 경우 데이터를 수정할 수 없다.
․ 그룹 함수
․ GROUP BY 절
․ DISTINCT 키워드
․ 의사 열 ROWNUM 키워드
․ 표현식에 의해 정의된 열
③ 뷰에 다음이 포함된 경우 뷰를 통해 데이터를 추가할 수 없다.
․ 그룹 함수
․ GROUP BY절
․ DISTINCT 키워드
․ 의사 열 ROWNUM 키워드
․ 표현식에 의해 정의된 열
․ 기본 테이블에서 뷰에 의해 선택되지 않은 열에 NOT NULL 제약 조건이 있는 경우
나열된 항목이 포함되어 있거나, 기본 테이블의 열중에 뷰에 의해 선택되지 않은 NOT NULL 열이 있는데 이 열에 기본값
이 지정되어 있지 않은 경우에는 뷰를 통해 데이터를 추가할 수 없다.
뷰에 필수 항목에 대한 값이 모두 있어야 데이터를 추가할 수 있다.
뷰를 통해 값을 직접 기본 테이블에 추가한다는 점을 기억해야 한다.
예제)
오라클 디비 예제 : CREATE VIEW dept_sum_vu
(naem, minsal, maxsal, avgsal)
AS
SELECT d.department_name, MIN(e.salary),
MAX(e.salary), AVG(e.esalary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.departement_name;
☞설명) 위 뷰를 질의 한다는 것은
SELECT * FROM dept_sum_vu;
즉,
SELECT d.department_name, MIN(e.salary),
MAX(e.salary), AVG(e.esalary)
FROM employees e, departments d
WHERE e.department_id = d.department_id
GROUP BY d.departement_name;
의 결과를 확인 하겠다는 것이다.
질의에 대한 결과는 한수에 의해 연산된 결과를 가지고 있는 것이므로 연산된 값을 임의적으로 수정 하거나 삭제할 수 없
는 것이므로 뷰를 통해서도 함수에 의해 연산된 결과를 보여주는 뷰인 경우엔 DML문을 사용 할 수 없다.
create view v_viewupd => 복합 뷰 생성
as
select t1.c1, t1.c2, t2.c3
from viewupd1 t1 join viewupd2 t2
on t1.c1 = t2.c1
select * from v_viewupd
c1 c2 c3
-------------
1 1 1
update v_viewupd
set c2 = 10
where c1 = 1
select * from v_viewupd -->view
c1 c2 c3
-------------
1 10 1
select * from viewupd1 --> table
c1 c2
---------
1 10
update v_viewupd
set c3 = 10
where c1 = 1
select * from v_viewupd
c1 c2 c3
--------------
1 10 10
select * from viewupd2 --> table
c1 c3
---------
1 10
update v_viewupd
set c2=20, c3=20
where c1=1
-- 한번에 여러개의 테이블에 적용시킬 수는 없다.
-- 한 테이블씩 변경을 해야한다.
--//뷰의 서브쿼리 확인
sp_helptext v_viewupd