안녕하세요. SQLER의 코난 김대우입니다.
이번 강좌에서는, 7-5. 뷰 옵션을 진행 하겠습니다.
SQLER에서 진행되는, 챗GPT와 함께 배우는 SQL Server 강좌 목록
이번에 진행할 강좌는 뷰(VIEW) 옵션입니다.
TL;DR
SCHEMABINDING(스키마 바인딩) 옵션으로 뷰와 테이블 간 무결성을 유지하는 방법을 다룹니다. 원본 테이블 스키마 변경 시 발생하는 영향과 SCHEMABINDING 옵션으로 테이블과 뷰 간의 의존성을 강화하는 방법을 진행합니다.
지난 7-2. 뷰 생성 강좌에서 암호화와 WITH CHECK 옵션을 이용해 뷰의 기능을 확장했습니다. 이번 강좌에서는 뷰의 SCHEMABINDING(스키마 바인딩)을 진행합니다.
뷰 SCHEMABINDING(스키마 바인딩)
뷰는 테이블의 거울입니다. 그렇다면, 뷰의 원본 테이블 스키마가 변경되면 뷰는 어떻게 될까요?
-- 테이블 조회 SELECT * FROM Employee; GO -- 뷰가 존재하면 삭제 IF OBJECT_ID(N'dbo.v_Employee', N'V') IS NOT NULL DROP VIEW dbo.v_Employee; GO -- v_Employee 뷰를 생성 CREATE VIEW v_Employee AS SELECT emp_num, emp_name, email FROM Employee; GO -- 뷰 조회 SELECT * FROM v_Employee; GO -- 테이블에서 email 컬럼을 삭제 ALTER TABLE Employee DROP COLUMN email; GO -- 뷰 조회 - 오류 발생 SELECT * FROM v_Employee; GO 메시지 207, 수준 16, 상태 1, 프로시저 v_Employee, 줄 5 [배치 시작 줄 23] Invalid column name 'email'. 메시지 4413, 수준 16, 상태 1, 줄 25 Could not use view or function 'v_Employee' because of binding errors.
뷰 바인딩 에러 메시지와 함께 오류가 발생합니다.
SCHEMABINDING 쿼리
뷰가 참조하는 원본 테이블을 함부로 변경하지 못하게 SCHEMABINDING 옵션을 설정할 수 있습니다. 이 경우, 원본 테이블을 수정하려고 시도하면, 테이블을 참조하는 개체가 있으니 수정이 불가하다는 메시지가 발생합니다.
-- 테이블이 존재하면 삭제 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 테이블 생성 CREATE TABLE Employee ( emp_num INT PRIMARY KEY, emp_login_pwd NVARCHAR(15), emp_name NVARCHAR(10), email NVARCHAR(15), emp_salary BIGINT ); 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 WITH SCHEMABINDING -- 스키마 바인딩 설정 AS SELECT emp_num, emp_name, email FROM dbo.Employee; -- 스키마.테이블명으로 설정 GO -- 원본 테이블에서 email 컬럼을 삭제 시도 - 오류 발생 ALTER TABLE Employee DROP COLUMN email; GO 메시지 5074, 수준 16, 상태 1, 줄 65 The object 'v_Employee' is dependent on column 'email'. 메시지 4922, 수준 16, 상태 9, 줄 65 ALTER TABLE DROP COLUMN email failed because one or more objects access this column.
이렇게, SCHEMABINDING을 이용해 테이블과 뷰의 무결성을 유지할 수 있습니다.
SQL 강좌 책 구매
강좌가 도움이 되셨다면, 책으로 구매 가능합니다. 책 판매 수익금은 전액 코딩 교육 사회공헌 활동에 기부되며, 아래 링크에서 구매하시면 더 많은 금액이 기부됩니다.