안녕하세요. 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 강좌 책 구매

강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다. 

 

책구매 링크: 챗GPT와 함께하는 마이크로소프트 SQL Server 2022 

책구매링크.png

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 36501
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 19832
2274 SQL강좌: 8-3. 저장 프로시저 - 매개변수(파라미터) 코난(김대우) 2023.08.18 84
2273 SQL강좌: 8-2. 저장 프로시저 - 생성과 실행 코난(김대우) 2023.08.18 111
2272 SQL강좌: 8-1. 저장 프로시저(Stored Procedure) - 소개 코난(김대우) 2023.08.18 86
2271 SQL강좌: 7-10. 실무에서 뷰 사용 코난(김대우) 2023.08.18 57
2270 SQL강좌: 7-9. 인덱싱된 뷰(Indexed View) file 코난(김대우) 2023.08.18 66
2269 SQL강좌: 7-8. 분할 뷰(Partitioned View) file 코난(김대우) 2023.08.18 48
» SQL강좌: 7-7. 뷰에서 데이터 수정 코난(김대우) 2023.08.18 49
2267 SQL강좌: 7-6. 뷰에서 뷰 생성 코난(김대우) 2023.08.18 74
2266 SQL강좌: 7-5. 뷰 옵션 코난(김대우) 2023.08.18 43
2265 SQL강좌: 7-4. 뷰 삭제 코난(김대우) 2023.08.18 33
2264 SQL강좌: 7-3. 뷰 수정 코난(김대우) 2023.08.18 55
2263 SQL강좌: 7-2. 뷰 생성 file 코난(김대우) 2023.08.18 52
2262 SQL강좌: 7-1. 뷰(VIEW) 소개 코난(김대우) 2023.08.18 89
2261 SQL강좌: 6-9. 데이터 무결성 - 데이터 무결성 주의사항 file 코난(김대우) 2023.08.18 75
2260 SQL강좌: 6-8. 데이터 무결성 - 트리거(TRIGGER) file 코난(김대우) 2023.08.18 109
2259 SQL강좌: 6-7. 데이터 무결성 - 사용자 정의 형식(User-Defined Type - UDT) 코난(김대우) 2023.08.18 61
2258 SQL강좌: 6-6. 데이터 무결성 - 기본값(DEFAULT) file 코난(김대우) 2023.08.18 36
2257 SQL강좌: 6-5. 데이터 무결성 - 규칙(RULE) 코난(김대우) 2023.08.18 64
2256 SQL강좌: 6-4. 데이터 무결성 - 체크 제약(CHECK Constraint) file 코난(김대우) 2023.08.18 70
2255 SQL강좌: 6-3. 데이터 무결성 - 기본 키(Primary Key) 제약, UNIQUE 제약, 외래 키(Foreign Key) 제약 file 코난(김대우) 2023.08.18 92





XE Login