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

ORA-04060
2026년 08월 22일 | DBMS Error 가이드

이 글에서 다루는 내용

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

ORA-04060 insufficient privileges to execute 는?

ORA-04060 에러는 Oracle 데이터베이스에서 특정 사용자가 저장 프로시저(Stored Procedure), 함수(Function), 패키지(Package), 또는 트리거(Trigger) 등의 PL/SQL 객체를 실행할 때 충분한 권한이 없을 경우 발생하는 에러입니다. 이 에러는 단순한 SELECT나 DML 권한 부족과는 달리, 코드 실행(EXECUTE) 권한과 관련된 문제로 주로 발생합니다. 특히 운영 환경에서 애플리케이션 계정이 신규 배포된 프로시저나 패키지를 호출할 때 자주 마주치게 되며, 시스템 장애로 이어질 수 있어 신속한 대응이 필요합니다.


주요 발생 원인

1. EXECUTE 권한 미부여 (가장 빈번한 원인)

Oracle에서 PL/SQL 객체를 실행하려면 반드시 해당 객체에 대한 EXECUTE 권한이 사용자에게 명시적으로 부여되어 있어야 합니다. 신규 프로시저나 패키지를 배포한 후 애플리케이션 계정 또는 호출 계정에 EXECUTE 권한을 빠트리는 경우가 실무에서 가장 흔하게 발생하는 원인입니다. 특히 DBA가 개발 환경에서는 권한을 부여했으나 운영 환경에서 이를 누락하는 케이스가 많습니다.

2. 컴파일 오류로 인한 객체 INVALID 상태

PL/SQL 객체가 의존하는 하위 객체(테이블, 뷰, 다른 프로시저 등)가 변경되거나 삭제되면 해당 객체가 INVALID 상태가 됩니다. INVALID 상태의 객체는 실행 시 자동 재컴파일을 시도하지만, 해당 시점에 실행 계정이 내부 객체에 대한 접근 권한이 없다면 ORA-04060과 유사한 권한 에러가 발생할 수 있습니다. 이 경우 단순히 EXECUTE 권한을 부여하는 것만으로는 해결되지 않으며, 객체를 명시적으로 재컴파일해야 합니다.

3. Invoker Rights vs Definer Rights 혼용 문제

Oracle PL/SQL에서는 AUTHID CURRENT_USER(Invoker Rights)와 AUTHID DEFINER(Definer Rights) 두 가지 실행 권한 모델이 존재합니다. Invoker Rights로 생성된 프로시저를 호출자가 내부에서 참조하는 객체에 대한 권한 없이 실행하면 ORA-04060 에러가 발생합니다. 개발자가 Definer Rights로 작성해야 할 프로시저를 실수로 Invoker Rights로 생성하거나, 반대의 경우에도 예기치 않은 권한 문제가 발생할 수 있어 설계 단계에서 이를 명확히 정의해야 합니다.


해결 방법

원인 1 해결: EXECUTE 권한 부여

현재 어떤 권한이 부여되어 있는지 먼저 확인한 후, 누락된 EXECUTE 권한을 부여합니다.

-- 특정 사용자의 객체 권한 현황 조회
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'YOUR_PROCEDURE_NAME'
  AND PRIVILEGE = 'EXECUTE';

-- 특정 프로시저에 EXECUTE 권한 부여
GRANT EXECUTE ON schema_owner.procedure_name TO app_user;

-- 특정 패키지에 EXECUTE 권한 부여
GRANT EXECUTE ON schema_owner.package_name TO app_user;

-- 역할(Role)을 통한 권한 부여 (여러 사용자에게 일괄 적용 시)
CREATE ROLE app_execute_role;
GRANT EXECUTE ON schema_owner.package_name TO app_execute_role;
GRANT app_execute_role TO app_user1;
GRANT app_execute_role TO app_user2;

-- PUBLIC에게 EXECUTE 권한 부여 (모든 사용자, 보안 주의 필요)
-- GRANT EXECUTE ON schema_owner.procedure_name TO PUBLIC;

원인 2 해결: INVALID 객체 재컴파일

-- INVALID 상태의 객체 목록 확인
SELECT OWNER, OBJECT_NAME, OBJECT_TYPE, STATUS, LAST_DDL_TIME
FROM DBA_OBJECTS
WHERE STATUS = 'INVALID'
  AND OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE', 'PACKAGE BODY', 'TRIGGER')
ORDER BY OWNER, OBJECT_TYPE, OBJECT_NAME;

-- 특정 프로시저 명시적 재컴파일
ALTER PROCEDURE schema_owner.procedure_name COMPILE;

-- 특정 패키지 재컴파일 (스펙과 바디 각각)
ALTER PACKAGE schema_owner.package_name COMPILE;
ALTER PACKAGE schema_owner.package_name COMPILE BODY;

-- 특정 함수 재컴파일
ALTER FUNCTION schema_owner.function_name COMPILE;

-- 스키마 내 모든 INVALID 객체 일괄 재컴파일 (UTL_RECOMP 패키지 활용)
EXEC UTL_RECOMP.RECOMP_SERIAL('SCHEMA_OWNER');

-- 데이터베이스 전체 INVALID 객체 재컴파일
EXEC UTL_RECOMP.RECOMP_PARALLEL(4); -- 4개 병렬 프로세스 사용

-- 재컴파일 후 상태 재확인
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE OWNER = 'SCHEMA_OWNER'
  AND STATUS = 'INVALID';

원인 3 해결: Invoker Rights / Definer Rights 확인 및 수정

-- 현재 프로시저의 AUTHID 설정 확인
SELECT OBJECT_NAME, OBJECT_TYPE, AUTHID
FROM DBA_PROCEDURES
WHERE OWNER = 'SCHEMA_OWNER'
  AND OBJECT_NAME = 'YOUR_PROCEDURE_NAME';

-- Definer Rights로 프로시저 재생성 (기본값, 권장)
CREATE OR REPLACE PROCEDURE schema_owner.procedure_name
AUTHID DEFINER  -- 프로시저 소유자의 권한으로 실행
AS
BEGIN
    -- 프로시저 본문
    EXECUTE IMMEDIATE 'SELECT * FROM some_table';
END;
/

-- Invoker Rights로 프로시저 생성 (호출자 권한으로 실행)
CREATE OR REPLACE PROCEDURE schema_owner.procedure_name
AUTHID CURRENT_USER  -- 호출자의 권한으로 실행
AS
BEGIN
    -- 호출자가 참조 객체에 권한이 있어야 함
    NULL;
END;
/

-- Invoker Rights 사용 시 호출자에게 필요한 권한 부여
GRANT SELECT ON schema_owner.some_table TO calling_user;
GRANT EXECUTE ON schema_owner.procedure_name TO calling_user;

예방 방법

1. 배포 스크립트에 권한 부여 자동화 포함

신규 PL/SQL 객체 배포 시 권한 부여를 누락하는 것을 방지하기 위해, 배포 스크립트에 반드시 GRANT 구문을 포함시키는 표준을 수립해야 합니다. 아래와 같이 배포 스크립트 템플릿을 정형화하여 CI/CD 파이프라인에 통합하면 인적 실수를 크게 줄일 수 있습니다.

-- 배포 스크립트 표준 템플릿 예시
-- Step 1: 객체 생성 또는 교체
CREATE OR REPLACE PROCEDURE schema_owner.new_procedure AS
BEGIN
    NULL;
END;
/

-- Step 2: 컴파일 상태 확인
SELECT OBJECT_NAME, STATUS
FROM USER_OBJECTS
WHERE OBJECT_NAME = 'NEW_PROCEDURE';

-- Step 3: 권한 자동 부여 (배포 스크립트 필수 포함)
GRANT EXECUTE ON schema_owner.new_procedure TO app_user;
GRANT EXECUTE ON schema_owner.new_procedure TO app_role;

-- Step 4: 권한 부여 결과 검증
SELECT GRANTEE, PRIVILEGE, GRANTABLE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'NEW_PROCEDURE'
  AND OWNER = 'SCHEMA_OWNER';

2. 정기적인 권한 감사(Audit) 및 모니터링 체계 구축

운영 환경에서는 정기적으로 객체 상태와 권한 현황을 점검하는 자동화된 모니터링 스크립트를 스케줄러(DBMS_SCHEDULER)에 등록하여 운영하는 것을 강력히 권장합니다. INVALID 객체 발생 시 DBA에게 즉시 알림이 가도록 구성하면 장애를 사전에 예방할 수 있습니다.

-- 권한 감사용 모니터링 쿼리 (정기 실행 권장)
SELECT 
    o.OWNER,
    o.OBJECT_NAME,
    o.OBJECT_TYPE,
    o.STATUS,
    p.GRANTEE,
    p.PRIVILEGE
FROM DBA_OBJECTS o
LEFT JOIN DBA_TAB_PRIVS p 
    ON o.OBJECT_NAME = p.TABLE_NAME 
    AND o.OWNER = p.OWNER
WHERE o.OBJECT_TYPE IN ('PROCEDURE', 'FUNCTION', 'PACKAGE')
  AND o.OWNER NOT IN ('SYS', 'SYSTEM', 'DBSNMP')
ORDER BY o.OWNER, o.OBJECT_TYPE, o.OBJECT_NAME;

관련 에러

  • ORA-01031: insufficient privileges — SELECT, INSERT, UPDATE, DELETE 등 일반 DML/DDL 권한 부족 시 발생하며, ORA-04060과 함께 가장 자주 마주치는 권한 관련 에러입니다.
  • ORA-04063: package body “OWNER.PACKAGE_NAME” has errors — 패키지 바디에 컴파일 에러가 있을 때 발생하며, INVALID 객체로 인한 ORA-04060의 선행 원인이 될 수 있습니다.
  • ORA-06508: PL/SQL: could not find program unit being called — 호출하려는 PL/SQL 객체가 존재하지 않거나 INVALID 상태일 때 발생하며, ORA-04060과 유사한 상황에서 함께 나타나는 경우가 많습니다.
  • ORA-00942: table or view does not exist — Invoker Rights 프로시저 내부에서 호출자가 접근 권한이 없는 테이블을 참조할 때 ORA-04060과 연계하여 발생할 수 있습니다.

DBMS 에러 코드 시리즈

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

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

댓글 남기기