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

ORA-00972
2026년 06월 23일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-00972 identifier is too long 는?

ORA-00972 에러는 Oracle 데이터베이스에서 테이블명, 컬럼명, 인덱스명, 시퀀스명 등 객체 식별자(Identifier)의 길이가 허용 한도를 초과했을 때 발생합니다. Oracle 12c Release 1 이하 버전에서는 식별자의 최대 길이가 30바이트로 제한되어 있으며, Oracle 12c Release 2(12.2) 이상에서는 128바이트까지 허용됩니다. 이 에러는 주로 타 DBMS에서 마이그레이션하거나, 자동화된 코드 생성 툴을 사용할 때, 또는 개발자가 긴 이름의 객체를 생성하려 할 때 빈번하게 나타납니다.


주요 발생 원인

  • 객체명(테이블, 컬럼, 인덱스 등)이 최대 허용 길이를 초과한 경우

가장 흔한 원인으로, 개발자가 가독성을 높이기 위해 지나치게 긴 이름을 사용할 때 발생합니다. Oracle 12c R1 이하에서는 30바이트를 초과하는 순간 즉시 에러가 발생하며, 영문 기준 30자, 한글 기준(UTF-8 환경)은 10자 내외에서 제한이 걸릴 수 있습니다. 특히 한글 식별자를 사용하는 경우 바이트 수가 급격히 늘어나므로 주의가 필요합니다.

  • 타 DBMS(MySQL, PostgreSQL, MSSQL 등)에서 마이그레이션 시 식별자 길이 차이

MySQL이나 PostgreSQL은 식별자 길이 제한이 64바이트, MSSQL은 128바이트까지 허용하기 때문에, 해당 DBMS에서 정상 동작하던 DDL 스크립트를 Oracle 12c R1 이하 환경에 그대로 적용하면 ORA-00972가 발생할 수 있습니다. 마이그레이션 프로젝트에서 특히 자주 발생하며, 수백 개의 테이블 DDL을 일괄 변환할 때 놓치기 쉬운 부분입니다.

  • ORM 프레임워크 또는 코드 자동 생성 툴이 생성한 긴 식별자

Hibernate, JPA, MyBatis Generator 등의 ORM 툴이나 ERD 툴에서 자동으로 생성하는 인덱스명, 제약조건명(Constraint Name)이 규칙에 따라 길어지는 경우가 많습니다. 예를 들어 FK_테이블명_참조테이블명_컬럼명 형식으로 자동 생성되는 이름은 금방 30자를 넘어버립니다. 이런 경우 애플리케이션 배포 시점까지 에러를 발견하지 못하는 경우가 많아 운영 장애로 이어질 수 있습니다.


해결 방법

원인 1 해결: 객체명 단축

식별자를 30자(Oracle 12c R1 이하) 이내로 줄여서 재생성합니다. 아래 예시처럼 약어 규칙을 적용하여 이름을 단축하세요.

-- 에러 발생 예시 (31자 초과)
CREATE TABLE user_account_detail_information (
    user_account_detail_information_id NUMBER PRIMARY KEY,
    user_full_name_description         VARCHAR2(100)
);
-- ORA-00972: identifier is too long

-- 해결: 약어를 사용하여 30자 이내로 단축
CREATE TABLE usr_acct_detail_info (
    usr_acct_detail_info_id NUMBER PRIMARY KEY,
    usr_full_name_desc      VARCHAR2(100)
);

기존 운영 중인 테이블의 컬럼명이 문제라면 ALTER TABLE RENAME COLUMN을 사용합니다.

-- 기존 컬럼명 변경 (Oracle 9i R2 이상)
ALTER TABLE emp_detail
RENAME COLUMN employee_full_legal_name_description TO emp_full_name_desc;

-- 기존 테이블명 변경
RENAME old_long_table_name_here TO new_short_name;

원인 2 해결: 마이그레이션 시 DDL 스크립트 사전 검증

마이그레이션 전 아래 스크립트로 현재 데이터베이스의 긴 식별자를 사전에 탐지하세요.

-- 현재 DB에서 30자 초과 테이블명 탐지
SELECT table_name, LENGTH(table_name) AS name_length
FROM   user_tables
WHERE  LENGTH(table_name) > 30
ORDER  BY name_length DESC;

-- 현재 DB에서 30자 초과 컬럼명 탐지
SELECT table_name, column_name, LENGTH(column_name) AS col_length
FROM   user_tab_columns
WHERE  LENGTH(column_name) > 30
ORDER  BY col_length DESC;

-- 인덱스명 탐지
SELECT index_name, LENGTH(index_name) AS idx_length
FROM   user_indexes
WHERE  LENGTH(index_name) > 30
ORDER  BY idx_length DESC;

-- 제약조건명 탐지
SELECT constraint_name, LENGTH(constraint_name) AS con_length
FROM   user_constraints
WHERE  LENGTH(constraint_name) > 30
ORDER  BY con_length DESC;

원인 3 해결: ORM 자동 생성 제약조건명 수동 지정

Hibernate/JPA를 사용하는 경우 @Table, @Column, @Index, @ForeignKey 어노테이션으로 명시적으로 이름을 지정하거나, Oracle DDL 생성 전 아래와 같이 제약조건명을 직접 지정합니다.

-- 제약조건명이 자동 생성되어 길어지는 경우
-- 나쁜 예 (Oracle이 자동 생성하는 이름에 의존)
ALTER TABLE order_detail_history
ADD CONSTRAINT fk_order_detail_history_product_master_product_id
    FOREIGN KEY (product_id) REFERENCES product_master(product_id);
-- ORA-00972 발생 가능

-- 좋은 예 (명시적으로 짧게 지정)
ALTER TABLE order_detail_history
ADD CONSTRAINT fk_ord_dtl_hist_prod_id
    FOREIGN KEY (product_id) REFERENCES product_master(product_id);

-- 인덱스도 동일하게 명시적으로 지정
CREATE INDEX idx_ord_dtl_hist_prod_id
ON order_detail_history(product_id);

Oracle 12c R2 이상으로 업그레이드 시 확인 사항

Oracle 12.2 이상에서는 기본적으로 128바이트까지 지원하지만, 반드시 COMPATIBLE 파라미터를 확인하세요.

-- Oracle 버전 및 호환성 파라미터 확인
SELECT * FROM v$version;
SHOW PARAMETER compatible;

-- 12.2 이상에서 긴 식별자 테스트
CREATE TABLE this_is_a_very_long_table_name_for_testing_purpose (
    this_is_a_very_long_column_name_for_testing NUMBER
);
-- 12.2 이상에서는 정상 동작 (128바이트 이내)

예방 방법

  • 사내 네이밍 컨벤션(Naming Convention) 표준 수립 및 준수

프로젝트 시작 전 테이블명, 컬럼명, 인덱스명, 제약조건명에 대한 명명 규칙을 문서화하고 팀 전체가 준수하도록 강제하세요. 예를 들어 테이블명은 최대 20자, 컬럼명은 최대 25자 등으로 여유 있게 제한선을 설정하면 Oracle 버전에 관계없이 안전합니다. CI/CD 파이프라인에 DDL 검증 스크립트를 포함시켜 배포 전 자동으로 식별자 길이를 체크하는 것도 좋은 방법입니다.

  • DDL 변경 전 스크립트 자동 검증 프로세스 도입

아래와 같은 검증 쿼리를 배포 파이프라인에 삽입하거나 코드 리뷰 체크리스트에 포함시켜, 실수로 긴 식별자가 운영 환경에 반영되는 것을 사전에 차단하세요. SQL*Plus나 SQLcl 스크립트로 만들어 두면 재사용이 편리합니다.

-- DDL 배포 전 식별자 길이 일괄 검증 스크립트 예시
-- (ALL_OBJECTS를 이용한 사전 검증)
SELECT object_type,
       object_name,
       LENGTH(object_name) AS name_len
FROM   user_objects
WHERE  LENGTH(object_name) > 28  -- 여유 2자를 두고 경고
ORDER  BY LENGTH(object_name) DESC;

관련 에러

  • ORA-00904: invalid identifier — 존재하지 않는 컬럼명이나 잘못된 식별자를 참조할 때 발생하며, 이름을 단축하는 과정에서 잘못 변경한 경우 연달아 발생할 수 있습니다.
  • ORA-00942: table or view does not exist — 테이블명을 잘못 단축하여 참조 오류가 발생하는 경우 함께 나타납니다.
  • ORA-02264: name already used by an existing constraint — 제약조건명을 변경하는 과정에서 중복된 이름을 사용할 때 발생합니다.
  • ORA-00955: name is already used by an existing object — 이미 존재하는 객체명과 동일한 이름으로 재생성 시도 시 발생합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기