2026년 07월 13일 | DBMS Error 가이드
이 글에서 다루는 내용
ORA-01430 에러의 원인 분석, 해결 SQL, 예방 방법을 실무 관점에서 정리합니다.
ORA-01430 column being added already exists in table 는?
ORA-01430 에러는 Oracle 데이터베이스에서 ALTER TABLE ... ADD COLUMN 구문을 실행할 때, 추가하려는 컬럼 이름이 해당 테이블에 이미 존재할 경우 발생하는 에러입니다. Oracle은 동일한 테이블 내에서 중복된 컬럼 이름을 허용하지 않기 때문에, 이미 존재하는 컬럼을 다시 추가하려고 시도하면 즉시 이 에러를 반환합니다. 주로 배포 스크립트를 반복 실행하거나, 여러 DBA 또는 개발자가 동시에 동일한 작업을 수행할 때, 혹은 마이그레이션 스크립트를 재실행하는 상황에서 자주 목격됩니다.
주요 발생 원인
- 배포 스크립트 또는 DDL 스크립트의 중복 실행
가장 빈번한 원인입니다. CI/CD 파이프라인이나 수동 배포 과정에서 동일한 DDL 스크립트가 두 번 이상 실행될 때 발생합니다. 예를 들어, 릴리즈 배포 후 롤백 없이 동일한 스크립트를 다시 실행하거나, 자동화 툴이 멱등성(idempotency) 처리 없이 스크립트를 재실행하는 경우가 이에 해당합니다. 특히 대규모 시스템 업그레이드나 패치 작업에서 스크립트 관리가 미흡할 때 자주 발생합니다.
- 여러 개발자 또는 DBA의 동시 작업 충돌
여러 명의 DBA나 개발자가 서로 소통 없이 동일한 테이블에 동일한 이름의 컬럼을 추가하려 할 때 발생합니다. 특히 팀 간 협업이 긴밀하지 않은 환경이나, 형상관리(SCM) 없이 DDL 스크립트가 공유될 때 이 문제가 생깁니다. 한 명이 먼저 컬럼을 추가한 상태에서 다른 사람이 동일 스크립트를 실행하면 에러가 발생합니다.
- 데이터 마이그레이션 또는 패치 스크립트의 재실행
시스템 마이그레이션, 버전 업그레이드, 또는 패치 적용 과정에서 스크립트가 이미 일부 적용된 상태임에도 불구하고 처음부터 다시 실행될 때 발생합니다. 마이그레이션 스크립트는 일반적으로 멱등성을 보장해야 하지만, 이를 고려하지 않고 단순 ALTER TABLE ADD 구문만 포함되어 있을 경우 재실행 시 반드시 이 에러가 발생합니다. 운영 환경에서는 이로 인해 배포 중단 사태로 이어질 수 있어 각별한 주의가 필요합니다.
해결 방법
1. 컬럼 존재 여부 확인 후 조건부 추가 (권장 방법)
실무에서 가장 안전한 방법은 컬럼을 추가하기 전에 먼저 해당 컬럼이 존재하는지 USER_TAB_COLUMNS 또는 ALL_TAB_COLUMNS 딕셔너리 뷰를 조회하여 확인하는 것입니다.
-- 컬럼 존재 여부 사전 확인
SELECT column_name
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES' -- 테이블명은 대문자로
AND column_name = 'DEPT_CODE'; -- 컬럼명은 대문자로
조회 결과가 없을 때만 컬럼을 추가하는 PL/SQL 블록을 사용하면 스크립트를 여러 번 실행해도 안전합니다.
-- 멱등성 보장 컬럼 추가 (PL/SQL 방식)
DECLARE
v_count NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_count
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
AND column_name = 'DEPT_CODE';
IF v_count = 0 THEN
EXECUTE IMMEDIATE 'ALTER TABLE employees ADD (dept_code VARCHAR2(10))';
DBMS_OUTPUT.PUT_LINE('컬럼이 성공적으로 추가되었습니다.');
ELSE
DBMS_OUTPUT.PUT_LINE('컬럼이 이미 존재합니다. 추가를 건너뜁니다.');
END IF;
END;
/
2. 에러를 무시하고 진행하는 방식 (주의 필요)
배포 스크립트에서 에러를 핸들링하여 ORA-01430이 발생해도 스크립트가 중단되지 않도록 처리할 수 있습니다. 단, 이 방식은 의도치 않은 에러까지 무시할 수 있으므로 신중하게 사용해야 합니다.
-- PL/SQL 예외 처리를 이용한 안전한 컬럼 추가
DECLARE
column_already_exists EXCEPTION;
PRAGMA EXCEPTION_INIT(column_already_exists, -1430); -- ORA-01430
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE employees ADD (dept_code VARCHAR2(10))';
DBMS_OUTPUT.PUT_LINE('컬럼 추가 완료.');
EXCEPTION
WHEN column_already_exists THEN
DBMS_OUTPUT.PUT_LINE('ORA-01430: 컬럼이 이미 존재합니다. 작업을 건너뜁니다.');
END;
/
3. 현재 테이블의 컬럼 목록 확인
에러 발생 시 먼저 현재 테이블의 컬럼 구성을 파악하는 것이 중요합니다.
-- 특정 테이블의 전체 컬럼 목록 조회
SELECT column_name,
data_type,
data_length,
nullable,
column_id
FROM user_tab_columns
WHERE table_name = 'EMPLOYEES'
ORDER BY column_id;
-- DBA 권한이 있을 경우 (다른 스키마 포함)
SELECT owner,
column_name,
data_type,
data_length,
nullable
FROM dba_tab_columns
WHERE table_name = 'EMPLOYEES'
AND owner = 'HR'
ORDER BY column_id;
4. 실제 에러 재현 및 확인
-- 에러 재현 예시
CREATE TABLE test_table (
id NUMBER PRIMARY KEY,
name VARCHAR2(100)
);
-- 최초 실행: 성공
ALTER TABLE test_table ADD (email VARCHAR2(200));
-- 재실행: ORA-01430 발생
ALTER TABLE test_table ADD (email VARCHAR2(200));
-- ORA-01430: column being added already exists in table
-- 정리
DROP TABLE test_table;
예방 방법
- DDL 스크립트에 멱등성(Idempotency) 보장 로직 적용
모든 DDL 배포 스크립트는 몇 번을 실행해도 동일한 결과를 내도록 작성해야 합니다. 앞서 소개한 PL/SQL 블록 방식을 표준 템플릿으로 채택하여 팀 전체가 공유하는 것이 좋습니다. 특히 Flyway, Liquibase 같은 데이터베이스 마이그레이션 툴을 사용한다면, 각 마이그레이션 스크립트에 버전을 부여하고 이미 적용된 스크립트는 재실행되지 않도록 관리하는 것을 강력히 권장합니다.
“`sql
— 표준 DDL 스크립트 템플릿 예시
DECLARE
v_cnt NUMBER;
BEGIN
— 컬럼 존재 확인
SELECT COUNT(*) INTO v_cnt
FROM user_tab_columns
WHERE table_name = UPPER(’employees’)
AND column_name = UPPER(‘hire_bonus’);
IF v_cnt = 0 THEN
EXECUTE IMMEDIATE
‘ALTER TABLE employees ADD (hire_bonus NUMBER(15,2) DEFAULT 0 NOT NULL)’;
END IF;
END;
/
“`
- DDL 스크립트 형상관리(SCM) 및 실행 이력 관리
Git 등의 형상관리 시스템을 통해 DDL 스크립트의 변경 이력을 철저히 관리하고, 별도의 DDL 변경 이력 테이블을 운용하여 어떤 스크립트가 언제, 누구에 의해 실행되었는지 추적해야 합니다. 이를 통해 중복 실행을 사전에 방지하고, 문제 발생 시 빠른 원인 분석이 가능해집니다.
“`sql
— DDL 변경 이력 관리 테이블 예시
CREATE TABLE ddl_change_log (
log_id NUMBER GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
script_name VARCHAR2(200) NOT NULL,
executed_by VARCHAR2(100) DEFAULT USER NOT NULL,
executed_at TIMESTAMP DEFAULT SYSTIMESTAMP NOT NULL,
status VARCHAR2(20) DEFAULT ‘SUCCESS’ NOT NULL,
remarks VARCHAR2(4000)
);
— 스크립트 실행 후 이력 기록
INSERT INTO ddl_change_log (script_name, remarks)
VALUES (‘V2.3.1__add_dept_code_to_employees.sql’, ‘부서코드 컬럼 추가’);
COMMIT;
“`
관련 에러
- ORA-00957: duplicate column name –
CREATE TABLE구문 내에서 동일한 컬럼 이름을 두 번 이상 정의했을 때 발생합니다. ORA-01430이 기존 테이블에 대한 에러라면, ORA-00957은 테이블 생성 시점의 에러입니다. - ORA-01408: such column list already indexed – 이미 인덱스가 존재하는 컬럼 조합에 중복 인덱스를 생성하려 할 때 발생하며, DDL 중복 실행 문제와 함께 나타날 수 있습니다.
- ORA-02264: name already used by an existing constraint – 동일한 이름의 제약조건이 이미 존재할 때 발생합니다. DDL 스크립트 재실행 시 컬럼 추가와 함께 제약조건도 중복 추가하려 할 때 동시에 마주칠 수 있는 에러입니다.
- ORA-00955: name is already used by an existing object – 이미 존재하는 객체(테이블, 뷰, 시퀀스 등)와 동일한 이름으로 객체를 생성하려 할 때 발생합니다.
주요 DBMS error code를 정리하는 시리즈입니다.
블로그 홈에서 다른 에러도 확인하세요.
본 포스트는 AI가 생성한 기술 가이드입니다. 운영 환경 적용 전 충분한 검토를 권장합니다.