ORA-04060: Insufficient Privileges to Execute — Causes, Fixes & Prevention
ORA-04060 is an Oracle database error that occurs when a user attempts to execute a stored procedure, function, package, or trigger without the necessary EXECUTE privilege. Unlike general privilege errors (ORA-01031), this error is specifically tied to PL/SQL object execution rights. It is one of the most common errors encountered after deployments, often causing application outages that require immediate DBA intervention.
Top 3 Causes and Fixes
Cause 1: Missing EXECUTE Privilege
The most common cause is simply that the EXECUTE privilege was never granted to the calling user or role after a new PL/SQL object was deployed. This frequently happens when development and production environments have different permission setups.
Diagnose:
-- Check existing EXECUTE privileges on the object
SELECT GRANTEE, OWNER, TABLE_NAME, PRIVILEGE
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'YOUR_PROCEDURE_NAME'
AND PRIVILEGE = 'EXECUTE';
Fix:
-- Grant EXECUTE to a specific user
GRANT EXECUTE ON schema_owner.procedure_name TO app_user;
-- Grant EXECUTE to a role (recommended for managing multiple users)
GRANT EXECUTE ON schema_owner.package_name TO app_role;
GRANT app_role TO app_user;
Cause 2: INVALID Object State
When a PL/SQL object depends on underlying objects (tables, views, other procedures) that have been modified or dropped, it becomes INVALID. Oracle will attempt to auto-recompile it at runtime, but if the executing account lacks privileges on dependent objects during recompilation, an ORA-04060 or similar error is raised.
Diagnose:
-- Find all INVALID PL/SQL objects
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')
ORDER BY OWNER, OBJECT_NAME;
Fix:
-- Recompile a specific procedure
ALTER PROCEDURE schema_owner.procedure_name COMPILE;
-- Recompile a specific package (spec and body)
ALTER PACKAGE schema_owner.package_name COMPILE;
ALTER PACKAGE schema_owner.package_name COMPILE BODY;
-- Recompile all INVALID objects in a schema using UTL_RECOMP
EXEC UTL_RECOMP.RECOMP_SERIAL('SCHEMA_OWNER');
Cause 3: Incorrect AUTHID Setting (Invoker vs. Definer Rights)
Oracle PL/SQL supports two execution models: AUTHID DEFINER (runs with the owner's privileges) and AUTHID CURRENT_USER (runs with the caller's privileges). When a procedure is created with AUTHID CURRENT_USER but the calling user lacks privileges on objects referenced inside the procedure, ORA-04060 is triggered.
Diagnose:
-- Check the AUTHID setting of a procedure or package
SELECT OBJECT_NAME, OBJECT_TYPE, AUTHID
FROM DBA_PROCEDURES
WHERE OWNER = 'SCHEMA_OWNER'
AND OBJECT_NAME = 'YOUR_PROCEDURE_NAME';
Fix:
-- Recreate with Definer Rights (most common, recommended default)
CREATE OR REPLACE PROCEDURE schema_owner.procedure_name
AUTHID DEFINER
AS
BEGIN
-- Executes with owner's privileges
NULL;
END;
/
-- If Invoker Rights is intentional, grant required privileges to the caller
GRANT SELECT ON schema_owner.some_table TO calling_user;
GRANT EXECUTE ON schema_owner.procedure_name TO calling_user;
Quick Prevention Tips
1. Always include GRANT statements in your deployment scripts.
Standardize your deployment process so that every new PL/SQL object creation is immediately followed by the appropriate EXECUTE grants. Integrate this into your CI/CD pipeline to eliminate human error.
-- Standard deployment template
CREATE OR REPLACE PROCEDURE schema_owner.new_proc AS
BEGIN NULL; END;
/
-- Always follow with grants
GRANT EXECUTE ON schema_owner.new_proc TO app_user;
-- Verify
SELECT GRANTEE, PRIVILEGE FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = 'NEW_PROC' AND OWNER = 'SCHEMA_OWNER';
2. Schedule regular audits for INVALID objects and missing privileges.
Use DBMS_SCHEDULER to run monitoring queries periodically and alert DBAs when INVALID objects are detected — before they cause runtime failures in production.
Related Oracle Errors
| Error Code | Description |
|---|---|
| ORA-01031 | Insufficient privileges (DML/DDL level) |
| ORA-04063 | Package body has compilation errors |
| ORA-06508 | Could not find PL/SQL program unit |
| ORA-00942 | Table or view does not exist (often paired with Invoker Rights issues) |
DBA Tip: Always test EXECUTE privileges from the application account directly after any deployment. A simple
EXEC schema_owner.procedure_name;run as the app user can save you from an unexpected production outage.
📖 Want a more detailed guide?
Check out the full in-depth version (Korean) on oraerror.com — includes detailed analysis, additional SQL examples, and prevention tips.
Top comments (0)