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 error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.