ALTER 문은 몇 줄이면 끝나지만, 운영 테이블 변경은 그 앞뒤가 더 중요합니다. 긴 문자열이 숨어 있거나, 컬럼이 인덱스와 뷰에 연결되어 있거나, 다른 세션이 테이블을 사용 중이면 예상하지 못한 실패와 대기가 생길 수 있습니다.
이 글은 컬럼을 추가·수정·삭제하기 전에 자주 확인하는 항목을 실제 조회 SQL과 함께 한 순서로 정리했습니다.
운영 ALTER는 ① 정확한 대상 확인 ② 데이터 적합성 확인 ③ 제약조건·인덱스·의존 객체 확인 ④ 백업과 복구 준비 ⑤ 실행 후 구조와 객체 상태 확인 순서로 접근하면 실수를 크게 줄일 수 있습니다.
1. 접속 계정과 대상 테이블부터 확인하기
동일한 테이블명이 개발·검증·운영 스키마에 모두 있을 수 있습니다. 실행 직전 현재 사용자와 데이터베이스 이름을 확인합니다.
SELECT USER AS CURRENT_USER
FROM DUAL;
SELECT SYS_CONTEXT('USERENV', 'DB_NAME') AS DB_NAME,
SYS_CONTEXT('USERENV', 'SERVICE_NAME') AS SERVICE_NAME
FROM DUAL;
대상 테이블의 소유자와 존재 여부도 확인합니다. 다른 스키마의 테이블이라면 권한과 스키마명을 분명히 해야 합니다.
SELECT OWNER, TABLE_NAME, STATUS
FROM ALL_TABLES
WHERE TABLE_NAME = 'MEMBER';
2. 현재 컬럼 구조 저장하기
변경 전 구조를 조회 결과나 배포 기록으로 남겨두면 검증과 복구 판단이 쉬워집니다.
SELECT COLUMN_ID,
COLUMN_NAME,
DATA_TYPE,
DATA_LENGTH,
DATA_PRECISION,
DATA_SCALE,
NULLABLE,
DATA_DEFAULT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'MEMBER'
ORDER BY COLUMN_ID;
3. 데이터가 새 조건에 맞는지 확인하기
길이를 줄이기 전에는 최대 문자 수와 바이트 수를 함께 확인합니다.
SELECT MAX(LENGTH(MEMBER_NAME)) AS MAX_CHAR_LENGTH,
MAX(LENGTHB(MEMBER_NAME)) AS MAX_BYTE_LENGTH
FROM MEMBER;
NOT NULL을 적용할 예정이라면 NULL 건수뿐 아니라 어떤 행인지도 확인합니다.
SELECT COUNT(*) AS NULL_COUNT
FROM MEMBER
WHERE MEMBER_NAME IS NULL;
SELECT MEMBER_ID
FROM MEMBER
WHERE MEMBER_NAME IS NULL
FETCH FIRST 20 ROWS ONLY;
문자열을 숫자로 옮겨야 한다면 변환할 수 없는 값을 먼저 찾습니다. 아래 예시는 Oracle 12.2 이상에서 사용할 수 있습니다.
SELECT MEMBER_ID, LOGIN_COUNT_TEXT
FROM MEMBER
WHERE VALIDATE_CONVERSION(LOGIN_COUNT_TEXT AS NUMBER) = 0;
4. 제약조건과 인덱스 확인하기
삭제하거나 이름을 바꿀 컬럼이 PK, FK, UNIQUE, CHECK 조건에 포함되어 있는지 확인합니다.
SELECT C.CONSTRAINT_NAME,
C.CONSTRAINT_TYPE,
CC.COLUMN_NAME,
C.STATUS
FROM USER_CONSTRAINTS C
JOIN USER_CONS_COLUMNS CC
ON CC.CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND CC.TABLE_NAME = C.TABLE_NAME
WHERE C.TABLE_NAME = 'MEMBER'
ORDER BY C.CONSTRAINT_NAME, CC.POSITION;
인덱스 컬럼도 따로 확인합니다.
SELECT INDEX_NAME,
COLUMN_NAME,
COLUMN_POSITION
FROM USER_IND_COLUMNS
WHERE TABLE_NAME = 'MEMBER'
ORDER BY INDEX_NAME, COLUMN_POSITION;
CASCADE CONSTRAINTS가 문장을 성공시켜 주더라도 그것이 안전하다는 뜻은 아닙니다. 함께 사라지는 제약조건과 다른 테이블에 미칠 영향을 먼저 문서화하세요.5. 뷰·프로시저 등 의존 객체 확인하기
Oracle이 관리하는 의존성은 USER_DEPENDENCIES에서 확인할 수 있습니다.
SELECT NAME,
TYPE,
REFERENCED_NAME,
REFERENCED_TYPE
FROM USER_DEPENDENCIES
WHERE REFERENCED_NAME = 'MEMBER'
ORDER BY TYPE, NAME;
동적 SQL이나 애플리케이션 소스처럼 데이터베이스가 추적하지 못하는 사용처도 있습니다. 저장 객체 조회만으로 영향 분석이 끝났다고 판단하지 말고 배포 저장소와 리포트, 배치 SQL도 함께 검색해야 합니다.
6. 실행 시간과 잠금 영향을 준비하기
ALTER TABLE은 대상 객체에 DDL 잠금을 요구합니다. 다른 트랜잭션이 테이블을 오래 사용 중이면 기다리거나 오류가 날 수 있고, 변경 종류와 데이터 규모에 따라 작업 시간이 달라집니다.
운영 반영 전에는 예상 소요 시간, 허용 가능한 대기 시간, 애플리케이션 영향, 중단 기준을 정해 두세요. 권한이 있는 DBA는 세션과 잠금 상태를 조직의 표준 진단 SQL로 확인하는 편이 안전합니다.
7. 복구 방법을 변경 종류에 맞게 준비하기
| 변경 | 주요 위험 | 준비할 복구 |
|---|---|---|
| 컬럼 추가 | 애플리케이션 호환성, 잠금 | 사용 중지 후 컬럼 제거 가능 여부 검토 |
| 길이·타입 변경 | 변환 실패, 데이터 손실 | 원본 데이터 보존, 역변환 가능성 검증 |
| 이름 변경 | SQL과 객체 참조 실패 | 애플리케이션 동시 배포 또는 이전 이름 복원안 |
| 컬럼 삭제 | 데이터 영구 손실 | 테이블·컬럼 데이터 백업과 복원 절차 |
Oracle DDL은 실행 전후에 암시적 커밋이 발생할 수 있습니다. 컬럼 삭제 후
ROLLBACK 한 줄로 되돌릴 수 있다고 가정하지 말고, 실제 복구 절차를 변경 전에 검증해야 합니다.8. 변경 후 구조와 객체 상태 확인하기
ALTER 문이 성공했다는 메시지만 보고 끝내지 않습니다. 컬럼 정의를 다시 조회하고 INVALID 객체가 생겼는지 확인합니다.
SELECT COLUMN_ID,
COLUMN_NAME,
DATA_TYPE,
DATA_LENGTH,
NULLABLE,
DATA_DEFAULT
FROM USER_TAB_COLUMNS
WHERE TABLE_NAME = 'MEMBER'
ORDER BY COLUMN_ID;
SELECT OBJECT_NAME,
OBJECT_TYPE,
STATUS
FROM USER_OBJECTS
WHERE STATUS = 'INVALID'
ORDER BY OBJECT_TYPE, OBJECT_NAME;
애플리케이션의 대표 조회와 저장 기능도 간단히 확인합니다. 데이터 건수, NULL 분포, 제약조건 상태와 실행 로그를 배포 기록에 남기면 이후 문제를 추적하기 편합니다.
실전 체크리스트
- 현재 사용자, DB와 서비스명을 확인한다.
- 변경 전 컬럼 정의를 저장한다.
- 길이, NULL, 변환 불가 데이터를 조회한다.
- 제약조건과 인덱스를 확인한다.
- DB 의존 객체와 애플리케이션 사용처를 찾는다.
- 작업 시간, 잠금 영향과 중단 기준을 정한다.
- 백업과 실제 복구 절차를 준비한다.
- 변경 후 구조, INVALID 객체와 대표 기능을 확인한다.
ALTER 문을 잘 쓰는 것보다 중요한 것은 변경해도 되는 상태인지 먼저 판단하는 일입니다. 이 순서를 작업 템플릿으로 저장해두면 컬럼 추가처럼 단순해 보이는 변경도 훨씬 차분하게 진행할 수 있습니다.
공식 문서
- Oracle Database 19c SQL Language Reference: ALTER TABLE
- Oracle Database 19c Reference: USER_DEPENDENCIES
- Oracle Database 19c Reference: USER_TAB_COLUMNS
컬럼을 추가·삭제하거나 이름과 COMMENT를 바꾸는 기본 문법이 궁금하다면 1편: 자주 쓰는 ALTER TABLE 7가지를 확인하세요.
컬럼 길이·DEFAULT·NULL 변경 방법이 궁금하다면 2편: Oracle MODIFY 사용법에서 예제와 함께 볼 수 있습니다.