반응형
ORA-01779: Cannot Modify a Column That Maps to a Non-Key-Preserved Table
ORA-01779 오류는 업데이트하려는 컬럼이 키가 보장되지 않는(non-key-preserved) 테이블에 속해 있을 때 발생합니다.
오류 원인
ORA-01779 오류는 다음과 같은 원인으로 발생할 수 있습니다:
- 업데이트할 테이블이 조인된 결과에서 키를 보장받지 못함: - 특정 테이블이 조인된 상태에서, 해당 테이블의 일부 컬럼이 기본 키 또는 고유 키로 보장되지 않음.
- 뷰(view)에서 UPDATE 시도가 발생했으나, 조인된 테이블이 key-preserved가 아님: - 뷰가 여러 테이블을 조인하여 생성되었고, 업데이트하려는 컬럼이 키 보장되지 않는 테이블에 속함.
- 중복 레코드가 있는 테이블을 조인한 상태에서 UPDATE를 수행하려 함: - 조인 결과가 다중 레코드를 반환할 경우, Oracle은 어떤 레코드를 업데이트해야 할지 결정할 수 없음.
해결 방법
이 오류를 해결하려면 다음 방법을 시도할 수 있습니다:
- 업데이트하려는 테이블이 키를 보장하는지 확인: 조인된 테이블이 키 보존을 보장하는지 확인하려면 기본 키 또는 고유 키를 확인해야 합니다.
SELECT table_name, constraint_name, constraint_type FROM user_constraints WHERE table_name = 'EXAMPLE_TABLE';
- 조인 조건 수정: 가능하면 조인 방식 또는 조인 조건을 수정하여 키를 보장하도록 변경합니다.
- MERGE 문 사용: 업데이트가 필요할 경우 `MERGE` 문을 사용하면 해결될 수도 있습니다.
MERGE INTO example_table e USING (SELECT id, new_value FROM another_table) a ON (e.id = a.id) WHEN MATCHED THEN UPDATE SET e.column_name = a.new_value;
- 뷰 대신 직접 테이블을 업데이트: 뷰를 통해 업데이트하는 대신, 직접 테이블을 업데이트하는 것이 좋습니다.
- INSTEAD OF 트리거 사용: 뷰를 업데이트해야 할 경우 `INSTEAD OF` 트리거를 생성하여 해결할 수 있습니다.
CREATE OR REPLACE TRIGGER update_view_trigger INSTEAD OF UPDATE ON example_view FOR EACH ROW BEGIN UPDATE example_table SET column_name = :NEW.column_name WHERE id = :OLD.id; END; /
간단 요약
- ORA-01779 오류는 조인된 테이블에서 키가 보장되지 않은 컬럼을 수정하려 할 때 발생합니다.
- 해결 방법: - 조인된 테이블의 키 보존 여부 확인 - `MERGE` 문을 사용하여 업데이트 수행 - 조인 조건을 수정하여 키 보장을 확보 - 뷰에서 직접 업데이트하지 않고, 대신 `INSTEAD OF` 트리거를 활용
반응형