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

ORA-01749
2026년 07월 30일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-01749 you may not GRANT/REVOKE privileges to/from yourself 는?

ORA-01749 에러는 Oracle 데이터베이스에서 사용자가 자기 자신에게 권한을 부여(GRANT)하거나 회수(REVOKE)하려 할 때 발생하는 에러입니다. Oracle의 권한 관리 체계는 보안 원칙에 따라 자기 자신에 대한 직접적인 권한 변경을 허용하지 않으며, 반드시 다른 사용자나 DBA를 통해 권한이 부여되어야 합니다. 이 에러는 스크립트 자동화 또는 애플리케이션 배포 과정에서 현재 세션 사용자와 대상 사용자가 동일할 때 자주 발생합니다.


주요 발생 원인

  • 자기 자신에게 직접 GRANT 시도

가장 흔한 원인으로, 현재 접속된 사용자 계정이 동일한 계정에 권한을 부여하려 할 때 발생합니다. 예를 들어 SCOTT 계정으로 접속한 상태에서 GRANT SELECT ON emp TO SCOTT;과 같은 구문을 실행하면 Oracle은 이를 자기 자신에 대한 권한 부여로 인식하고 ORA-01749를 반환합니다. 이는 보안 취약점을 방지하기 위한 Oracle의 설계 원칙입니다.

  • 동적 SQL 또는 스크립트 내 변수 오류로 인한 잘못된 사용자명 참조

배포 자동화 스크립트나 PL/SQL 프로시저 내에서 동적으로 사용자명을 변수로 처리할 때, 변수에 현재 세션의 사용자명이 잘못 할당되어 자기 자신에게 권한을 부여하는 구문이 생성되는 경우입니다. 예를 들어 EXECUTE IMMEDIATE 'GRANT DBA TO ' || v_username; 구문에서 v_username이 현재 사용자와 동일한 값을 가질 때 이 에러가 발생합니다. 스크립트 작성 시 변수 값을 반드시 검증하는 로직이 필요합니다.

  • GRANT OPTION 또는 ADMIN OPTION을 이용한 재부여 시 동일 사용자 지정

어떤 사용자가 WITH GRANT OPTION 또는 WITH ADMIN OPTION으로 권한을 받은 후, 해당 권한을 다시 자기 자신에게 부여하려는 경우 이 에러가 발생합니다. 권한 위임 구조를 설계할 때 권한 체인(Grant Chain)을 충분히 이해하지 못한 상태에서 잘못된 권한 부여 대상을 지정할 때 주로 발생합니다. 이 경우 권한 부여 대상이 자신이 아닌 다른 사용자인지 반드시 확인해야 합니다.


해결 방법

원인 1 해결: 다른 DBA 또는 관리자 계정으로 권한 부여

자기 자신에게 직접 권한을 부여하는 것은 불가능하므로, 반드시 SYS, SYSTEM 또는 DBA 권한을 가진 별도의 계정으로 접속하여 권한을 부여해야 합니다.

-- 잘못된 예 (SCOTT 계정으로 접속한 상태에서 실행 시 ORA-01749 발생)
GRANT SELECT ON scott.emp TO SCOTT;

-- 올바른 예 (SYS 또는 SYSTEM 계정으로 접속 후 실행)
CONNECT system/manager
GRANT SELECT ON scott.emp TO SCOTT;

-- 또는 현재 사용자를 확인하는 쿼리로 대상 사용자를 검증
SELECT USER FROM DUAL;

원인 2 해결: 동적 SQL 내 사용자명 검증 로직 추가

PL/SQL이나 동적 SQL을 사용하는 경우, 현재 사용자와 대상 사용자가 동일한지 사전에 검증하는 조건문을 반드시 추가해야 합니다.

-- 잘못된 예 (변수 검증 없이 동적 SQL 실행)
DECLARE
    v_username VARCHAR2(30) := 'SCOTT'; -- 현재 사용자와 동일할 경우 에러 발생
BEGIN
    EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO ' || v_username;
END;
/

-- 올바른 예 (현재 사용자와 대상 사용자 비교 후 실행)
DECLARE
    v_username VARCHAR2(30) := 'SCOTT';
BEGIN
    IF v_username = USER THEN
        DBMS_OUTPUT.PUT_LINE('ERROR: 자기 자신에게 권한을 부여할 수 없습니다.');
        RAISE_APPLICATION_ERROR(-20001, 'Cannot grant privileges to yourself.');
    ELSE
        EXECUTE IMMEDIATE 'GRANT CREATE SESSION TO ' || v_username;
        DBMS_OUTPUT.PUT_LINE('권한 부여 완료: ' || v_username);
    END IF;
END;
/

원인 3 해결: WITH GRANT OPTION 사용 시 대상 사용자 명확히 지정

GRANT OPTION 또는 ADMIN OPTION으로 권한을 재부여할 때는 반드시 자신과 다른 사용자를 대상으로 지정해야 합니다.

-- 잘못된 예 (MANAGER 계정이 자기 자신에게 재부여 시도)
-- MANAGER 계정으로 접속된 상태
GRANT SELECT ON hr.employees TO MANAGER; -- ORA-01749 발생

-- 올바른 예 (MANAGER 계정이 다른 사용자에게 권한 위임)
GRANT SELECT ON hr.employees TO DEVELOPER1;
GRANT SELECT ON hr.employees TO DEVELOPER2;

-- 현재 세션 사용자 확인 후 대상 결정
SELECT SYS_CONTEXT('USERENV', 'SESSION_USER') AS current_user FROM DUAL;

-- DBA_SYS_PRIVS를 통해 권한 부여 현황 확인
SELECT GRANTEE, PRIVILEGE, ADMIN_OPTION
FROM DBA_SYS_PRIVS
WHERE GRANTEE = 'MANAGER';

-- DBA_TAB_PRIVS를 통해 객체 권한 확인
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE GRANTEE = 'MANAGER';

예방 방법

  • 권한 부여 전 현재 세션 사용자와 대상 사용자를 항상 검증하는 표준 프로시저 수립

조직 내 DBA 운영 표준에 권한 부여 전 검증 단계를 의무화하여, 모든 GRANT/REVOKE 작업이 자동화 스크립트를 통해 수행되더라도 대상 사용자가 현재 세션 사용자와 동일한지 비교하는 로직을 반드시 포함하도록 합니다. USER 또는 SYS_CONTEXT('USERENV', 'SESSION_USER')를 활용하여 사전 검증을 수행하는 공통 유틸리티 프로시저를 작성하여 재사용하는 것이 좋습니다.

“`sql

— 권한 부여 전 사용자 검증을 위한 표준 유틸리티 예시

CREATE OR REPLACE PROCEDURE safe_grant_privilege(

p_privilege IN VARCHAR2,

p_grantee IN VARCHAR2

) AS

BEGIN

IF UPPER(p_grantee) = USER THEN

RAISE_APPLICATION_ERROR(-20001,

‘ORA-01749 방지: 자기 자신에게 권한을 부여할 수 없습니다. Grantee: ‘ || p_grantee);

END IF;

EXECUTE IMMEDIATE ‘GRANT ‘ || p_privilege || ‘ TO ‘ || p_grantee;

DBMS_OUTPUT.PUT_LINE(‘권한 [‘ || p_privilege || ‘] 이(가) [‘ || p_grantee || ‘] 에게 부여되었습니다.’);

END safe_grant_privilege;

/

“`

  • 권한 관리는 반드시 전용 DBA 계정으로만 수행하고, 일반 사용자 계정에 GRANT 권한 부여를 최소화

애플리케이션 계정이나 일반 사용자 계정에 WITH ADMIN OPTION이나 WITH GRANT OPTION을 남발하지 않도록 권한 관리 정책을 수립합니다. 권한 부여 및 회수 작업은 SYS, SYSTEM 또는 별도로 지정된 DBA 전용 계정에서만 수행하도록 운영 절차를 명문화하고, 정기적으로 DBA_SYS_PRIVSDBA_TAB_PRIVS를 감사(Audit)하여 불필요한 GRANT 권한 보유 사용자를 식별하고 정리합니다.


관련 에러

  • ORA-01031 (insufficient privileges): 권한이 부족할 때 발생하며, GRANT 작업을 수행할 충분한 권한이 없는 경우 ORA-01749와 함께 자주 접하게 됩니다.
  • ORA-01720 (grant option does not exist for object): WITH GRANT OPTION 없이 객체 권한을 타인에게 재부여하려 할 때 발생하는 에러로, 권한 체인 설계 시 ORA-01749와 함께 고려해야 합니다.
  • ORA-00942 (table or view does not exist): 권한을 부여하려는 객체가 존재하지 않거나 접근 권한이 없을 때 발생하며, GRANT 구문 작성 시 자주 동반됩니다.
DBMS 에러 코드 시리즈

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

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

댓글 남기기