안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 7-7. 뷰에서 데이터 수정을 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 뷰(VIEW)에서 데이터 수정입니다.
TL;DR
뷰에서 INSERT, UPDATE, DELETE 작업 가능성과 제약 사항을 다루며, 뷰가 참조하는 테이블 수정에 의해 발생하는 영향을 설명합니다.
뷰 강좌가 진행될수록 점점 더 많은 뷰의 기능에 놀라실 겁니다. 실제 대규모 데이터베이스 시스템에서 뷰가 많이 쓰이기 때문이기도 합니다.
그렇다면, 뷰에서 데이터를 수정할 수 있을까요?
이전 강좌에서 뷰 UPDATE 구문을 잠시 보여드렸습니다. 그렇다면, INSERT나 DELETE는 어떨까요? 이번 강좌에서 조금 더 상세히 살펴보겠습니다.
뷰에 INSERT / UPDATE / DELETE 수행
뷰에 INSERT를 할 경우 어떤 문제가 생길까요? 기본적으로 가능합니다.
하지만, 동작하지 않는 경우도 있습니다. 다음 예제 SQL 쿼리를 수행해 테스트합니다.
-- 테이블이 존재하면 삭제 IF OBJECT_ID(N'dbo.Employee', N'U') IS NOT NULL DROP TABLE dbo.Employee; GO -- 뷰가 존재하면 삭제 IF OBJECT_ID(N'dbo.v_Employee', N'V') IS NOT NULL DROP VIEW dbo.v_Employee; GO -- employee 테이블 생성 - NOT NULL로 설정 CREATE TABLE Employee ( emp_num INT PRIMARY KEY, emp_login_pwd NVARCHAR(15) NOT NULL, emp_name NVARCHAR(10) NOT NULL, email NVARCHAR(15) NOT NULL, emp_salary BIGINT NOT NULL ); GO -- employee 테이블에 예제 데이터 삽입 INSERT INTO Employee (emp_num, emp_login_pwd, emp_name, email, emp_salary) VALUES (1, N'password1234', N'김대우', N'kdw@example.com', 20000000), (2, N'password!@#$', N'손석구', N'ssk@example.com', 100000000), (3, N'asdfqwer!@#$', N'박은빈', N'peb@example.com', 120000000); GO -- v_Employee 뷰를 생성 CREATE VIEW v_Employee AS SELECT emp_num, emp_name, email FROM Employee; GO -- 뷰에 데이터 삽입을 시도 INSERT INTO v_Employee(emp_num, emp_name, email) VALUES(4, N'김우빈', N'kwb@example.com'); 오류 발생 메시지 515, 수준 16, 상태 2, 줄 130 Cannot insert the value NULL into column 'emp_salary', table 'AdventureWorks.dbo.Employee'; column does not allow nulls. INSERT fails. The statement has been terminated. -- 뷰에 UPDATE. 제약에 걸리지 않을 경우 뷰에 대해 업데이트가 가능합니다. UPDATE v_Employee SET email = N'ebp@example.com' WHERE emp_name LIKE N'박은빈'; -- 뷰에 DELETE. 조건에 부합될 경우 역시 삭제 가능합니다. DELETE FROM v_Employee WHERE emp_name LIKE N'박은빈';
INSERT를 수행할 경우, 테이블의 컬럼 중 NOT NULL로 구성되어 있는 컬럼이 있고, 뷰는 컬럼의 일부만 반영하고 있습니다. 뷰를 통해 테이블에 결국 INSERT가 되어야 하는데, NOT NULL 제약으로 인해 INSERT가 실패하게 됩니다. UPDATE나 DELETE는 조건에 맞는 행과 컬럼의 값 제약에 걸리지 않으면 이렇게 문제없이 수행되고, INSERT에 비해 UPDATE나 DELETE는 제약 조건을 맞추기 수월합니다.
수정이 불가능한 뷰
네, 결국 뷰 수정은 뷰가 참조하는 테이블을 수정합니다. 이 전제조건을 고려하면 대략적인 조건을 예상할 수 있습니다.
- 기본적으로, 하나의 기본 테이블 컬럼만 참조가능해 JOIN으로 생성된 뷰는 불가
- 기본 데이터가 아닌 집계함수(AVG, COUNT, SUM)가 사용된 파생된 뷰는 불가
- 수정 컬럼이 GROUP BY나 HAVING 절에 있으면 안 됩니다.
이런 조건이 있습니다. INSERT/UPDATE/DELETE처럼 기본 1개 테이블 작업이며, 집계나 집합은 실제 테이블이 아니고, JOIN은 2개 이상 테이블 작업이니 이런 제한만 피하면 뷰를 어렵지 않게 수정할 수 있습니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.