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

ORA-01045
2026년 07월 01일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01045 user lacks CREATE SESSION privilege; logon denied 는?

ORA-01045 에러는 데이터베이스에 접속하려는 사용자 계정에 CREATE SESSION 권한이 부여되어 있지 않을 때 발생하는 오류입니다. Oracle에서 데이터베이스에 로그인하기 위해서는 가장 기본적인 시스템 권한인 CREATE SESSION이 반드시 필요하며, 이 권한 없이는 어떠한 방법으로도 데이터베이스에 접속할 수 없습니다. 주로 신규 사용자 계정 생성 후 권한 부여를 누락했거나, 기존 사용자의 권한이 잘못 회수(REVOKE)된 경우, 또는 DBA가 롤(Role) 설정을 잘못한 경우에 빈번하게 발생합니다.


주요 발생 원인

1. 신규 사용자 계정 생성 후 CREATE SESSION 권한 미부여

가장 흔한 원인으로, DBA가 CREATE USER 구문으로 계정을 생성한 뒤 권한 부여 단계를 빠뜨리는 경우입니다. Oracle은 사용자 계정을 생성한다고 해서 자동으로 어떤 권한도 부여하지 않기 때문에, 생성 직후 반드시 GRANT CREATE SESSION 또는 GRANT CONNECT 롤을 부여해야 합니다. 특히 여러 계정을 한꺼번에 생성하는 배치 작업 시 누락이 발생하기 쉽습니다.

2. REVOKE 또는 롤(Role) 변경으로 인한 기존 권한 박탈

운영 중 보안 정책 변경, 감사(Audit) 작업, 또는 실수로 REVOKE 명령을 실행하여 기존 사용자의 CREATE SESSION 권한이 제거된 경우입니다. 특히 CONNECT 롤을 통해 간접적으로 권한을 받은 사용자의 경우, DBA가 해당 롤 자체를 수정하거나 롤에서 사용자를 제외시키면 모든 연관 사용자가 동시에 접속 불가 상태가 됩니다. 이는 운영 중인 서비스에서 대규모 장애를 유발할 수 있으므로 매우 주의가 필요합니다.

3. 계정 생성 스크립트 오류 또는 마이그레이션 누락

개발 환경에서 운영 환경으로 스키마를 마이그레이션하거나, DDL 스크립트를 통해 계정을 일괄 생성할 때 권한 부여 스크립트가 누락되거나 실행 순서가 잘못된 경우 발생합니다. 특히 Data Pump(expdp/impdp)를 사용한 마이그레이션 시 권한 정보가 완전히 이전되지 않을 수 있으며, 마이그레이션 후 반드시 권한 상태를 검증하는 절차가 필요합니다.


해결 방법

해결책 1: CREATE SESSION 권한 직접 부여

가장 빠른 해결 방법은 SYS 또는 DBA 계정으로 접속하여 해당 사용자에게 직접 권한을 부여하는 것입니다.

-- SYS 또는 DBA 권한을 가진 계정으로 접속 후 실행
-- 특정 사용자에게 CREATE SESSION 권한 부여
GRANT CREATE SESSION TO username;

-- 예시: TESTUSER 계정에 권한 부여
GRANT CREATE SESSION TO testuser;

-- 권한 부여 확인
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'TESTUSER';

해결책 2: CONNECT 롤을 통한 권한 부여 (권장)

실무에서는 개별 권한보다 CONNECT 롤을 부여하는 방식이 일반적이며, 이 방법은 기본적인 접속 권한과 함께 몇 가지 추가 권한을 함께 부여합니다.

-- CONNECT 롤 부여 (CREATE SESSION 포함)
GRANT CONNECT TO username;

-- 예시: 여러 사용자에게 동시 부여
GRANT CONNECT TO user1, user2, user3;

-- CONNECT 롤에 포함된 권한 확인
SELECT PRIVILEGE
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'CONNECT';

-- 특정 사용자에게 부여된 롤 확인
SELECT GRANTED_ROLE, DEFAULT_ROLE, ADMIN_OPTION
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'TESTUSER';

해결책 3: 현재 권한 상태 진단 및 일괄 복구

여러 사용자가 동시에 접속 불가 상태일 경우, 아래 진단 쿼리로 권한 미부여 계정을 식별한 뒤 일괄 처리합니다.

-- CREATE SESSION 권한이 없는 일반 사용자 계정 조회
-- (SYS, SYSTEM 등 기본 계정 제외)
SELECT U.USERNAME, U.ACCOUNT_STATUS, U.CREATED
FROM DBA_USERS U
WHERE U.USERNAME NOT IN (
    SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE PRIVILEGE = 'CREATE SESSION'
    UNION
    SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'CONNECT'
)
AND U.USERNAME NOT IN ('SYS','SYSTEM','DBSNMP','SYSMAN','OUTLN',
                        'WMSYS','EXFSYS','CTXSYS','XDB','ANONYMOUS')
ORDER BY U.CREATED DESC;

-- 일괄 권한 부여 스크립트 생성 (생성 후 검토하여 실행)
SELECT 'GRANT CREATE SESSION TO ' || USERNAME || ';'
FROM DBA_USERS
WHERE USERNAME NOT IN (
    SELECT GRANTEE FROM DBA_SYS_PRIVS WHERE PRIVILEGE = 'CREATE SESSION'
    UNION
    SELECT GRANTEE FROM DBA_ROLE_PRIVS WHERE GRANTED_ROLE = 'CONNECT'
)
AND ACCOUNT_STATUS = 'OPEN';

해결책 4: 권한 부여 이력 추적 (Audit 활용)

-- Oracle Unified Auditing을 사용하는 경우 권한 변경 이력 확인
SELECT EVENT_TIMESTAMP, DBUSERNAME, ACTION_NAME, SYSTEM_PRIVILEGE_USED
FROM UNIFIED_AUDIT_TRAIL
WHERE ACTION_NAME IN ('GRANT', 'REVOKE')
AND OBJECT_NAME = 'CREATE SESSION'
ORDER BY EVENT_TIMESTAMP DESC;

-- 전통적인 감사 방식
SELECT OS_USERNAME, USERNAME, USERHOST, TIMESTAMP, ACTION_NAME
FROM DBA_AUDIT_TRAIL
WHERE ACTION_NAME IN ('GRANT', 'REVOKE')
ORDER BY TIMESTAMP DESC;

예방 방법

1. 사용자 계정 생성 표준 템플릿 수립 및 체크리스트 적용

신규 사용자 계정 생성 시 반드시 권한 부여까지 포함된 표준 스크립트를 작성하고, DBA팀 내 공식 절차로 채택하여 누락을 원천 차단해야 합니다. 아래와 같은 표준 생성 템플릿을 활용하면 실수를 방지할 수 있습니다.

-- 표준 사용자 계정 생성 템플릿
-- 1단계: 계정 생성
CREATE USER new_username IDENTIFIED BY "StrongPassword123!"
    DEFAULT TABLESPACE users
    TEMPORARY TABLESPACE temp
    QUOTA 100M ON users;

-- 2단계: 기본 접속 권한 부여 (필수)
GRANT CREATE SESSION TO new_username;

-- 3단계: 필요한 추가 권한 부여
GRANT CREATE TABLE, CREATE VIEW, CREATE PROCEDURE TO new_username;

-- 4단계: 생성 결과 검증
SELECT USERNAME, ACCOUNT_STATUS, DEFAULT_TABLESPACE
FROM DBA_USERS WHERE USERNAME = 'NEW_USERNAME';

SELECT PRIVILEGE FROM DBA_SYS_PRIVS WHERE GRANTEE = 'NEW_USERNAME';

2. 권한 변경 작업 전 영향도 분석 및 사전 백업

REVOKE 명령 실행 전 반드시 영향 받는 사용자 범위를 사전에 파악하고, 변경 작업 전 현재 권한 상태를 스크립트로 백업해두어야 합니다. 특히 롤(Role)에 대한 권한 변경은 해당 롤을 부여받은 모든 사용자에게 즉시 영향을 미치므로 운영 시간 외에 진행하고 롤백 계획을 반드시 수립해야 합니다.

-- 권한 변경 전 현재 상태 스냅샷 저장
CREATE TABLE priv_backup_YYYYMMDD AS
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION, COMMON, INHERITED
FROM DBA_SYS_PRIVS
WHERE GRANTEE NOT IN ('SYS','SYSTEM');

관련 에러

  • ORA-01017: invalid username/password; logon denied — 사용자명 또는 패스워드가 틀렸을 때 발생하며, ORA-01045와 함께 로그인 실패의 대표적인 에러입니다.
  • ORA-28000: the account is locked — 계정이 잠긴 상태로 접속을 시도할 때 발생합니다. 패스워드 오류 반복 또는 DBA의 수동 잠금이 원인입니다.
  • ORA-28001: the password has expired — 패스워드 유효기간이 만료된 경우 발생하며, 프로파일(Profile) 설정과 연관됩니다.
  • ORA-00942: table or view does not exist — 접속 성공 후 객체 접근 권한이 없을 때 발생하는 에러로, 권한 관리 맥락에서 ORA-01045와 함께 자주 언급됩니다.
  • ORA-01031: insufficient privilegesCREATE SESSION 이외의 권한이 부족할 때 발생하는 일반적인 권한 부족 에러입니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기