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

ORA-01435
2026년 07월 14일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01435 user does not exist 는?

ORA-01435 에러는 Oracle 데이터베이스에서 특정 사용자(스키마)를 참조하거나 해당 사용자로 작업을 수행하려 할 때, 시스템이 그 사용자를 찾을 수 없을 때 발생하는 에러입니다. 주로 ALTER USER, DROP USER, GRANT, REVOKE 등의 DDL 명령어나 CREATE DATABASE LINK 같은 구문에서 존재하지 않는 사용자명을 지정했을 때 나타납니다. 데이터베이스 마이그레이션, 스키마 변경, 또는 스크립트 자동화 작업 중에 특히 자주 발생하며, 사용자 이름의 오타나 대소문자 혼용이 원인이 되는 경우도 많습니다.


주요 발생 원인

1. 존재하지 않는 사용자명을 명령어에 사용한 경우

가장 흔한 원인으로, GRANT, REVOKE, ALTER USER, DROP USER 등의 명령어에서 데이터베이스에 실제로 생성되지 않은 사용자명을 입력했을 때 발생합니다. 사용자 이름의 오타, 대소문자 혼용, 또는 다른 환경(개발/운영)의 사용자명을 그대로 사용하는 경우가 이에 해당합니다. Oracle은 내부적으로 사용자명을 대문자로 저장하므로, 따옴표 처리 방식에 따라 예상치 못한 불일치가 생길 수 있습니다.

2. 사용자가 삭제된 이후 해당 사용자를 참조하는 스크립트가 실행된 경우

배포 스크립트나 유지보수 스크립트가 이미 삭제된 사용자를 대상으로 권한 부여, 객체 생성, 동의어 생성 등을 시도할 때 이 에러가 발생합니다. 특히 여러 환경에 걸쳐 동일한 스크립트를 사용하거나, 스크립트 실행 순서가 잘못된 경우에 빈번하게 나타납니다. 스크립트 내에서 사전에 사용자의 존재 여부를 확인하지 않으면 중간에 스크립트가 중단될 수 있습니다.

3. 데이터베이스 링크(Database Link) 생성 시 잘못된 사용자 지정

CREATE DATABASE LINK 구문에서 원격 데이터베이스에 존재하지 않는 사용자 계정을 지정하거나, 로컬 데이터베이스에서 인증 사용자를 잘못 참조하는 경우에도 ORA-01435가 발생할 수 있습니다. 또한 CONNECT TO 절에 오타가 있거나 해당 계정이 원격 DB에서 잠금/삭제된 상태라면 링크 생성 자체가 실패합니다. 이는 분산 데이터베이스 환경에서 자주 간과되는 원인 중 하나입니다.


해결 방법

원인 1 해결: 사용자 존재 여부 확인 후 명령 실행

먼저 DBA_USERS 뷰를 조회하여 해당 사용자가 실제로 존재하는지 확인합니다.

-- 사용자 존재 여부 확인
SELECT username, account_status, created
FROM dba_users
WHERE username = UPPER('target_user');

-- 사용자가 없다면 먼저 생성
CREATE USER target_user IDENTIFIED BY "SecurePassword123!";

-- 이후 권한 부여
GRANT CONNECT, RESOURCE TO target_user;
GRANT CREATE SESSION TO target_user;

사용자명이 소문자나 특수문자를 포함하는 경우, 큰따옴표로 감싸서 생성된 경우가 있으므로 아래와 같이 정확하게 조회합니다.

-- 대소문자 구분 없이 조회
SELECT username FROM dba_users
WHERE UPPER(username) = UPPER('TargetUser');

원인 2 해결: 스크립트 실행 전 사용자 존재 여부 동적 체크

PL/SQL을 활용하여 사용자가 없을 경우 먼저 생성하거나 안전하게 건너뛰는 로직을 구성합니다.

-- 사용자 존재 여부 확인 후 생성하는 PL/SQL 블록
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count
  FROM dba_users
  WHERE username = 'TARGET_USER';

  IF v_count = 0 THEN
    EXECUTE IMMEDIATE 'CREATE USER target_user IDENTIFIED BY "TempPass#2024"';
    EXECUTE IMMEDIATE 'GRANT CONNECT, RESOURCE TO target_user';
    DBMS_OUTPUT.PUT_LINE('사용자 target_user 생성 완료.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('사용자 target_user 이미 존재함.');
  END IF;
END;
/

-- 삭제 시에도 존재 확인 후 삭제
DECLARE
  v_count NUMBER;
BEGIN
  SELECT COUNT(*) INTO v_count
  FROM dba_users
  WHERE username = 'TARGET_USER';

  IF v_count > 0 THEN
    EXECUTE IMMEDIATE 'DROP USER target_user CASCADE';
    DBMS_OUTPUT.PUT_LINE('사용자 삭제 완료.');
  ELSE
    DBMS_OUTPUT.PUT_LINE('삭제할 사용자가 존재하지 않습니다.');
  END IF;
END;
/

원인 3 해결: 데이터베이스 링크 생성 시 사용자 검증

-- 로컬 DB의 사용자 확인
SELECT username, account_status
FROM dba_users
WHERE username = 'LINK_USER';

-- 올바른 데이터베이스 링크 생성 예제
CREATE DATABASE LINK remote_db_link
  CONNECT TO valid_remote_user IDENTIFIED BY "RemotePass#2024"
  USING 'REMOTE_DB_TNS';

-- 기존 잘못된 링크 삭제 후 재생성
DROP DATABASE LINK old_invalid_link;

-- 데이터베이스 링크 목록 조회 (현재 세션)
SELECT db_link, username, host
FROM user_db_links;

-- DBA 권한으로 전체 링크 조회
SELECT owner, db_link, username, host
FROM dba_db_links
ORDER BY owner, db_link;

예방 방법

1. 배포 스크립트에 사전 검증 로직 삽입

모든 배포 스크립트의 첫 번째 단계로, 스크립트에서 참조하는 사용자가 데이터베이스에 존재하는지 확인하는 검증 블록을 반드시 포함시킵니다. 이를 통해 스크립트 실행 도중 예기치 않은 중단을 방지하고, 문제 발생 시 즉각적인 원인 파악이 가능합니다. CI/CD 파이프라인에 통합할 경우, 배포 전 단계(pre-deploy step)로 아래와 같은 검증 쿼리를 실행하도록 자동화하는 것이 좋습니다.

-- 배포 전 필수 사용자 존재 여부 일괄 확인 쿼리
SELECT 'MISSING USER: ' || u.username AS check_result
FROM (
  SELECT 'APP_USER' AS username FROM dual
  UNION ALL
  SELECT 'BATCH_USER' FROM dual
  UNION ALL
  SELECT 'READONLY_USER' FROM dual
) u
WHERE NOT EXISTS (
  SELECT 1 FROM dba_users d
  WHERE d.username = u.username
);

2. 사용자 관리 이력 테이블 운영 및 명명 규칙 표준화

데이터베이스 사용자 생성, 수정, 삭제 이력을 별도의 관리 테이블이나 문서로 관리하고, 사용자 명명 규칙(Naming Convention)을 조직 내에서 표준화합니다. 환경별(개발/QA/운영) 사용자 목록을 항상 최신 상태로 유지하고, DDL 감사(Audit) 기능을 활성화하여 사용자 생성/삭제 이벤트를 자동으로 기록합니다.

-- DDL 감사 활성화 (사용자 생성/삭제 추적)
AUDIT CREATE USER;
AUDIT DROP USER;
AUDIT ALTER USER;

-- 감사 로그 조회
SELECT os_username, username, userhost, timestamp, action_name, obj_name
FROM dba_audit_trail
WHERE action_name IN ('CREATE USER', 'DROP USER', 'ALTER USER')
ORDER BY timestamp DESC;

관련 에러

  • ORA-01917: user or role does not exist — GRANT/REVOKE 구문에서 사용자 또는 롤이 존재하지 않을 때 발생하며, ORA-01435와 유사한 맥락에서 나타납니다.
  • ORA-00942: table or view does not exist — 존재하지 않는 스키마의 테이블을 참조할 때 발생하며, 사용자 부재로 인한 연쇄 에러로 나타날 수 있습니다.
  • ORA-01918: user does not exist — 일부 Oracle 버전에서 ORA-01435와 동일한 상황에서 혼용되어 발생하는 에러입니다.
  • ORA-28000: the account is locked — 사용자는 존재하지만 계정이 잠긴 경우로, ORA-01435와 혼동하지 않도록 주의가 필요합니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기