키 보존 테이블(Key-Preserved Table) 은 View(뷰)에서 특정 테이블의 기본 키(Primary Key)가 유지되는 테이블을 의미합니다. (뷰에 rowid를 제공하는 테이블)
즉, 뷰를 통해 SELECT, INSERT, UPDATE, DELETE 작업을 수행할 때, 기본 키(Primary Key)가 그대로 유지되는 테이블을 말합니다.
📌 주요 개념:
Oracle에서 뷰(View)를 사용하면 데이터를 읽기 전용(READ-ONLY) 으로 볼 수 있습니다.
그러나 일부 뷰에서는 INSERT
, UPDATE
, DELETE
같은 DML(데이터 조작) 작업이 허용됩니다.
이때, 키 보존 테이블이 포함된 뷰에서만 해당 테이블의 데이터 수정이 가능합니다.
✅ 즉, 키 보존 테이블이 아니면 뷰를 통해 DML을 실행할 수 없음!
뷰가 단일 테이블을 기반으로 할 때, 해당 테이블의 기본 키가 유지되므로 키 보존 테이블이 됩니다.
CREATE VIEW emp_view AS
SELECT employee_id, first_name, last_name, department_id
FROM employees;
employees
테이블의 기본 키(PK: employee_id)가 뷰에서도 유지됨.emp_view
에서 UPDATE
, INSERT
, DELETE
수행 가능집UPDATE emp_view
SET last_name = 'Smith'
WHERE employee_id = 100; -- ✅ 성공 (키 보존 테이블이므로 가능)
👉 JOIN된 뷰에서는 기본 키가 유지되는 테이블만 DML 가능
CREATE VIEW emp_dept_view AS
SELECT e.employee_id, e.first_name, e.department_id, d.department_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;
employees
의 기본 키 employee_id는 뷰에서도 유일성을 유지departments
의 department_id는 중복될 가능성이 있음employees
는 키 보존 테이블이지만, departments
는 키 보존 테이블이 아님.UPDATE emp_dept_view
SET first_name = 'John'
WHERE employee_id = 101; -- ✅ 성공 (키 보존 테이블인 employees에 대한 변경)
UPDATE emp_dept_view
SET department_name = 'HR'
WHERE department_id = 10; -- ❌ 오류 (departments 테이블은 키 보존되지 않음)
DISTINCT
, GROUP BY
, AGGREGATE FUNCTIONS(SUM, COUNT, AVG 등)
을 사용하지 않아야 함. CREATE VIEW emp_distinct AS
SELECT DISTINCT department_id FROM employees;
DISTINCT
를 사용하면 기본 키(employee_id)가 사라짐.emp_distinct
뷰에서는 UPDATE
불가능.UPDATE emp_distinct
SET department_id = 50 WHERE department_id = 10;
-- ❌ 오류: 기본 키가 보존되지 않으므로 UPDATE 불가능
CREATE VIEW emp_grouped AS
SELECT department_id, COUNT(*) AS emp_count
FROM employees
GROUP BY department_id;
GROUP BY
를 사용하면 기본 키(employee_id)가 유지되지 않음.emp_grouped
뷰에서는 UPDATE
, INSERT
, DELETE
불가능.UPDATE emp_grouped
SET emp_count = 10 WHERE department_id = 20;
-- ❌ 오류: 키 보존되지 않음 (기본 키 X)
키 보존되지 않는 테이블이 있는 뷰에서도 INSTEAD OF TRIGGER를 사용하면 DML 가능.
CREATE OR REPLACE TRIGGER emp_dept_trigger
INSTEAD OF UPDATE ON emp_dept_view
FOR EACH ROW
BEGIN
UPDATE employees
SET first_name = :NEW.first_name
WHERE employee_id = :OLD.employee_id;
END;
emp_dept_view
에서 employees 테이블에 대한 UPDATE 가능.경우 | 키 보존 여부 | DML 가능 여부 |
---|---|---|
단일 테이블 뷰 (기본 키 유지) | ✅ 가능 | ✅ 가능 |
JOIN 뷰에서 기본 키 유지 | ✅ 가능 | ✅ 가능 (해당 테이블만) |
JOIN 뷰에서 기본 키 유지되지 않음 | ❌ 불가능 | ❌ 오류 발생 |
DISTINCT, GROUP BY 포함 | ❌ 불가능 | ❌ 오류 발생 |
INSTEAD OF TRIGGER 사용 | ✅ 가능 | ✅ 가능 |
💡 결론:
🚀 뷰에서 데이터를 수정하고 싶다면, 키 보존 여부를 꼭 확인해야 합니다!
오늘은 AI 생태계에 혁신적인 변화를 가져올 것으로 예상되는 MCP(Model Context Protocol)에 대해 상세히 알아보겠습니다. 2024년…
1. TPM이란? TPM(Trusted Platform Module)은 국제 표준 기반의 보안 하드웨어 칩으로, 컴퓨터나 디지털 장비 내에서…
시즌2, 기대했는데... 실망도 두 배!두뇌싸움을 기대했는데, 전략도 없는 자기들만의 감정에 따른 편가르기, 정치싸움이 되어 버린…
BPF(Berkeley Packet Filter) 도어는 해커가 관리자 몰래 뒷문을 새로 만든 것입니다.해커가 명령을 내려 특정 데이터들을 뒷문을…
1. IPC의 개념과 목적 1.1 IPC란 무엇인가? IPC (Inter-Process Communication)는 운영체제 내의 서로 독립적인 프로세스…