SW/Database / / 2025. 2. 12. 14:54

ORA-01779: Cannot Modify a Column That Maps to a Non-Key-Preserved Table / 원인과 해결 방법

반응형

ORA-01779: Cannot Modify a Column That Maps to a Non-Key-Preserved Table

ORA-01779 오류는 업데이트하려는 컬럼이 키가 보장되지 않는(non-key-preserved) 테이블에 속해 있을 때 발생합니다.

 

 

ORA-01779: Cannot Modify a Column That Maps to a Non-Key-Preserved Table / 원인과 해결 방법

 

 

 

오류 원인

ORA-01779 오류는 다음과 같은 원인으로 발생할 수 있습니다:

  1. 업데이트할 테이블이 조인된 결과에서 키를 보장받지 못함: - 특정 테이블이 조인된 상태에서, 해당 테이블의 일부 컬럼이 기본 키 또는 고유 키로 보장되지 않음.
  2. 뷰(view)에서 UPDATE 시도가 발생했으나, 조인된 테이블이 key-preserved가 아님: - 뷰가 여러 테이블을 조인하여 생성되었고, 업데이트하려는 컬럼이 키 보장되지 않는 테이블에 속함.
  3. 중복 레코드가 있는 테이블을 조인한 상태에서 UPDATE를 수행하려 함: - 조인 결과가 다중 레코드를 반환할 경우, Oracle은 어떤 레코드를 업데이트해야 할지 결정할 수 없음.

해결 방법

이 오류를 해결하려면 다음 방법을 시도할 수 있습니다:

  1. 업데이트하려는 테이블이 키를 보장하는지 확인: 조인된 테이블이 키 보존을 보장하는지 확인하려면 기본 키 또는 고유 키를 확인해야 합니다.
    SELECT table_name, constraint_name, constraint_type
    FROM user_constraints
    WHERE table_name = 'EXAMPLE_TABLE';
  2. 조인 조건 수정: 가능하면 조인 방식 또는 조인 조건을 수정하여 키를 보장하도록 변경합니다.
  3. 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;
  4. 뷰 대신 직접 테이블을 업데이트: 뷰를 통해 업데이트하는 대신, 직접 테이블을 업데이트하는 것이 좋습니다.
  5. 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` 트리거를 활용
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유