必须显式授予EXECUTE权限且对象名带schema,否则报ORA-00942;DEBUG权限可实现只读定义不执行;EXECUTE ANY PROCEDURE属高危权限,需审计并禁用;包权限须授整个包而非单个过程。

必须显式授予 EXECUTE 权限,且对象名必须带 schema;不加 schema 会报 ORA-00942,不是语法错,是权限缺失导致的解析失败。
GRANT EXECUTE ON 必须写全 schema.procedure_name
Oracle 不自动补 schema,哪怕当前用户就是 owner,也必须写明。比如:
GRANT EXECUTE ON hr.get_employee_info TO scott;
以下写法全部错误:
-
GRANT EXECUTE ON get_employee_info TO scott;→ 报ORA-00942 -
GRANT EXECUTE ON "Get_Employee_Info" TO scott;→ 若原过程未用双引号创建,大小写不敏感,但加了双引号就强制区分,匹配失败 -
GRANT EXECUTE ON hr.GET_EMPLOYEE_INFO TO scott;→ 大写没问题(默认建过程是大写),但若建时用了"get_employee_info",这里就必须完全一致
EXECUTE ANY PROCEDURE 是高危权限,慎用
它绕过对象级控制,允许执行任意 schema 下的任意过程,但不包含过程内部访问的表权限。典型风险点:
- 授予后,
app_user可以执行EXEC sys.dbms_stats.gather_table_stats();—— 这等于开放 DBA 级能力 - 即使有了该权限,如果过程里查了
hr.employees,仍需单独GRANT SELECT ON hr.employees TO app_user; - 生产环境应禁用,审计命令:
SELECT * FROM dba_sys_privs WHERE privilege = 'EXECUTE ANY PROCEDURE';
包里的过程要授权整个包,不能只授单个过程
Oracle 对包(package)的权限控制是粒度到包级别,不是包内过程级别。例如:
GRANT EXECUTE ON hr.emp_pkg TO scott;
这样 scott 才能调用 hr.emp_pkg.get_dept_list 或 hr.emp_pkg.update_salary。以下无效:
-
GRANT EXECUTE ON hr.emp_pkg.get_dept_list TO scott;→ 语法错误,Oracle 不支持 - 只授包体(body)没用,权限检查只认包头(spec)
- 如果包里有 SQL 查询其他用户表,仍需额外对象权限,比如
GRANT SELECT ON hr.departments TO scott;
DEBUG 权限可实现“只读定义”,不等于 EXECUTE
想让某用户只能看存储过程源码、不能执行,用 DEBUG 权限而非 EXECUTE:
GRANT DEBUG ON hr.get_employee_info TO analyst;
验证效果:
-
analyst可以执行SELECT text FROM all_source WHERE name = 'GET_EMPLOYEE_INFO' AND owner = 'HR'; - 但执行
EXEC hr.get_employee_info;会报PLS-00201: identifier 'HR.GET_EMPLOYEE_INFO' must be declared -
DEBUG权限不隐含执行能力,也不触发过程内 DML 或查询的权限校验
注意:DEBUG 权限在部分 Oracle 版本中需额外 DEBUG CONNECT SESSION 系统权限才能生效,但查看源码本身只需对象级 DEBUG。


















