Oracle ORA-12014 오류 원인과 해결 방법 완벽 가이드

ORA-12014
2026년 09월 05일 | DBMS Error 가이드

이 글에서 다루는 내용

ORA-12014 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.

ORA-12014 table does not contain a primary key constraint 는?

ORA-12014 에러는 Materialized View(구체화 뷰)를 생성하거나 빠른 갱신(Fast Refresh)을 설정할 때, 기반이 되는 테이블에 기본 키(Primary Key) 제약 조건이 존재하지 않을 경우 발생하는 에러입니다. Oracle은 Materialized View Log를 사용하는 빠른 갱신 방식에서 변경된 행을 추적하기 위해 기본 키가 반드시 필요하기 때문에, 이 제약 조건이 없으면 작업 자체를 거부합니다. 주로 CREATE MATERIALIZED VIEW LOG ON 구문이나 REFRESH FAST 옵션을 사용하는 환경에서 자주 마주치는 에러입니다.


주요 발생 원인

  • Materialized View Log 생성 시 기본 키 미존재

가장 흔한 원인으로, Materialized View의 빠른 갱신(Fast Refresh)을 지원하기 위해 CREATE MATERIALIZED VIEW LOG ON 테이블명 구문을 실행할 때 해당 테이블에 Primary Key가 정의되어 있지 않은 경우입니다. Oracle의 Fast Refresh 메커니즘은 내부적으로 변경된 행을 식별하기 위해 기본 키 값을 사용하는데, 기본 키가 없으면 어떤 행이 변경되었는지를 유일하게 특정할 수 없어 에러가 발생합니다. 레거시 시스템이나 초기 설계가 미흡한 테이블에서 특히 자주 발생합니다.

  • 기존 기본 키가 비활성화(DISABLED) 또는 삭제된 경우

테이블에 기본 키가 원래 존재했지만, DBA 또는 개발자가 데이터 마이그레이션이나 대량 INSERT 작업의 성능 향상을 위해 제약 조건을 일시적으로 비활성화(DISABLE)하거나 아예 삭제(DROP)한 상태에서 Materialized View 관련 작업을 시도할 때 이 에러가 발생합니다. 제약 조건이 DISABLE 상태이면 Oracle은 이를 유효한 기본 키로 인식하지 않기 때문에, 활성화(ENABLE) 상태여야만 정상적으로 동작합니다. 운영 환경에서 정기적인 배치 작업 후 제약 조건 복구를 누락했을 때 발생하는 경우가 많습니다.

  • Materialized View 대상 테이블을 잘못 지정한 경우

여러 테이블을 조인하거나 복잡한 쿼리를 기반으로 Materialized View를 구성할 때, 조인 대상 테이블 중 하나 이상에 기본 키가 없는 경우에도 이 에러가 발생할 수 있습니다. 특히 임시 테이블(Global Temporary Table)이나 외부 테이블(External Table), 또는 뷰(View)를 기반으로 Materialized View를 생성하려 할 때 기본 키 구조가 불명확하여 에러가 유발됩니다. 쿼리 작성 시 각 테이블의 제약 조건 현황을 사전에 확인하지 않으면 이런 실수가 발생하기 쉽습니다.


해결 방법

원인 1 해결: 기본 키 추가 후 Materialized View Log 생성

기본 키가 없는 테이블에 Primary Key를 추가한 뒤, Materialized View Log를 생성합니다.

-- 현재 테이블의 제약 조건 확인
SELECT constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'SALES_DATA';

-- 기본 키 추가 (기존 컬럼이 NOT NULL이고 유일한 값을 가져야 함)
ALTER TABLE sales_data
ADD CONSTRAINT pk_sales_data PRIMARY KEY (sale_id);

-- 기본 키 추가 후 Materialized View Log 생성
CREATE MATERIALIZED VIEW LOG ON sales_data
WITH PRIMARY KEY
INCLUDING NEW VALUES;

-- Materialized View 생성 (Fast Refresh 옵션 포함)
CREATE MATERIALIZED VIEW mv_sales_summary
REFRESH FAST ON COMMIT
AS
SELECT sale_id, product_id, SUM(amount) AS total_amount
FROM sales_data
GROUP BY sale_id, product_id;

원인 2 해결: 비활성화된 기본 키 재활성화

기본 키가 DISABLE 상태인 경우 ENABLE로 변경합니다.

-- 제약 조건 상태 확인
SELECT constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'ORDERS'
  AND constraint_type = 'P';

-- 비활성화된 기본 키 활성화
ALTER TABLE orders
ENABLE CONSTRAINT pk_orders;

-- 활성화 후 상태 재확인
SELECT constraint_name, status
FROM user_constraints
WHERE table_name = 'ORDERS'
  AND constraint_type = 'P';

-- 활성화 확인 후 Materialized View Log 생성
CREATE MATERIALIZED VIEW LOG ON orders
WITH PRIMARY KEY, ROWID
INCLUDING NEW VALUES;

원인 3 해결: 조인 테이블 모두 기본 키 확인 후 Materialized View 생성

-- 스키마 내 기본 키가 없는 테이블 전체 조회
SELECT table_name
FROM user_tables
WHERE table_name NOT IN (
    SELECT table_name
    FROM user_constraints
    WHERE constraint_type = 'P'
      AND status = 'ENABLED'
);

-- 조인 기반 Materialized View 생성 시 각 테이블 기본 키 확인
-- employees 테이블 기본 키 추가
ALTER TABLE employees
ADD CONSTRAINT pk_employees PRIMARY KEY (employee_id);

-- departments 테이블 기본 키 추가
ALTER TABLE departments
ADD CONSTRAINT pk_departments PRIMARY KEY (department_id);

-- 두 테이블 모두 기본 키 설정 후 Materialized View 생성
CREATE MATERIALIZED VIEW mv_emp_dept
REFRESH FAST ON DEMAND
AS
SELECT e.employee_id, e.emp_name, d.dept_name
FROM employees e
JOIN departments d ON e.department_id = d.department_id;

대안: ROWID 기반 Materialized View Log 사용 (기본 키 추가가 어려운 경우)

기본 키를 추가할 수 없는 상황이라면 ROWID 기반의 Materialized View Log를 사용할 수 있지만, 이 방법은 일부 제한 사항이 있습니다.

-- ROWID 기반 Materialized View Log 생성 (PRIMARY KEY 없이 사용 가능)
CREATE MATERIALIZED VIEW LOG ON legacy_table
WITH ROWID
INCLUDING NEW VALUES;

-- ROWID 기반 Materialized View 생성
CREATE MATERIALIZED VIEW mv_legacy
REFRESH FAST ON DEMAND
WITH ROWID
AS
SELECT rowid AS base_rowid, col1, col2, col3
FROM legacy_table;

예방 방법

  • 테이블 설계 단계에서 기본 키 의무화 정책 수립

모든 테이블에는 반드시 기본 키를 정의하도록 설계 표준을 수립하고, DDL 리뷰 프로세스에 이를 검증하는 단계를 포함시켜야 합니다. 아래 스크립트를 주기적으로 실행하여 기본 키가 없는 테이블을 조기에 발견하고 관리하는 것이 좋습니다.

“`sql

— 기본 키 없는 테이블 정기 점검 쿼리 (스케줄러 등록 권장)

SELECT t.owner, t.table_name, t.num_rows

FROM dba_tables t

WHERE t.owner NOT IN (‘SYS’, ‘SYSTEM’, ‘DBSNMP’, ‘SYSMAN’)

AND t.table_name NOT IN (

SELECT c.table_name

FROM dba_constraints c

WHERE c.constraint_type = ‘P’

AND c.status = ‘ENABLED’

AND c.owner = t.owner

)

ORDER BY t.owner, t.table_name;

“`

  • 제약 조건 변경 시 변경 관리 프로세스 적용

데이터 마이그레이션이나 대량 데이터 작업을 위해 제약 조건을 임시 비활성화할 경우, 반드시 작업 완료 후 재활성화를 보장하는 절차(체크리스트, 자동화 스크립트)를 마련해야 합니다. 아래와 같은 방식으로 제약 조건 비활성화 및 재활성화를 하나의 트랜잭션 블록 내에서 관리하면 누락을 방지할 수 있습니다.

“`sql

— 작업 전 제약 조건 비활성화

ALTER TABLE sales_data DISABLE CONSTRAINT pk_sales_data;

— 대량 작업 수행

INSERT INTO sales_data SELECT * FROM sales_data_staging;

— 작업 후 반드시 재활성화 (VALIDATE 옵션으로 무결성 검증 포함)

ALTER TABLE sales_data ENABLE VALIDATE CONSTRAINT pk_sales_data;

“`


관련 에러

  • ORA-12015: Materialized View가 Fast Refresh를 지원하지 않는 쿼리 구조일 때 발생합니다. ORA-12014와 함께 Materialized View 설정 시 자주 쌍으로 등장하는 에러입니다.
  • ORA-02437: 기본 키 제약 조건을 활성화할 때 중복 값이 존재하여 PRIMARY KEY 위반이 발생하는 에러로, 기본 키를 새로 추가하려 할 때 ORA-12014 해결 과정에서 연달아 마주칠 수 있습니다.
  • ORA-12016: Materialized View에 ROWID를 포함하지 않았을 때 Fast Refresh가 불가능하다는 에러로, ROWID 기반 대안 방법 적용 시 관련됩니다.
  • ORA-23413: 테이블에 Materialized View Log가 없을 때 발생하는 에러로, ORA-12014 해결 후 Log 생성을 누락했을 때 뒤이어 발생하는 경우가 많습니다.

DBMS 에러 코드 시리즈

주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.

본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.

댓글 남기기