oracle中grant execute必须显式指定schema名,如grant execute on hr.get_employee_info to scott;包内过程不可单独授权,须授予整个包;同义词不绕过权限检查;authid definer下角色授权无效,需直接授权用户。

GRANT EXECUTE ON 必须带 schema 名
Oracle 不会自动补全 schema,GRANT EXECUTE ON proc_name TO user 一定失败,报 ORA-00942: table or view does not exist。因为数据库根本找不到不带 schema 的对象名。
正确写法必须显式写出 owner.schema:
-
GRANT EXECUTE ON hr.get_employee_info TO scott;✅ -
GRANT EXECUTE ON app_pkg.check_balance TO report_user;✅ -
GRANT EXECUTE ON hr."Get_Employee_Info" TO scott;⚠️ 若过程名建时用了双引号且含大小写,授权也必须严格匹配
注意:授权语句本身不校验对象是否存在——哪怕 hr.get_employee_info 根本不存在,GRANT 也能成功执行;但后续调用 EXEC hr.get_employee_info 会直接报错。
包内过程不能单独授权
Oracle 对 package 的权限控制是包级粒度的,不支持对包内某个过程或函数单独授权。
以下写法语法错误,会报 ORA-00905: missing keyword:
-
GRANT EXECUTE ON hr.emp_pkg.get_dept_info TO scott;❌
必须授整个包:
-
GRANT EXECUTE ON hr.emp_pkg TO scott;✅
包中所有过程、函数、类型都随包一起获得执行权;无法按需收缩到单个子程序。
同义词不绕过权限检查
有人以为建个同义词就能简化调用,比如:
CREATE SYNONYM my_proc FOR hr.proc_a;
但调用 EXEC my_proc 时,Oracle 先解析出真实对象是 hr.proc_a,再检查当前用户对 hr.proc_a 是否有 EXECUTE 权限。同义词只是别名,不改变权限模型。
所以仍需执行:
GRANT EXECUTE ON hr.proc_a TO scott;
否则调用时照样报 PLS-00201 或 ORA-00942。
AUTHID DEFINER 下角色权限无效
如果存储过程定义为 AUTHID DEFINER(默认行为),那么调用者即使拥有含 EXECUTE 权限的角色,也无法成功执行。
常见错误链路:
GRANT EXECUTE ON app_owner.p_check_balance TO app_exec_role;GRANT app_exec_role TO app_user;
结果:app_user 调用时报 PLS-00201。
唯一可靠方式是直接授权:
-
GRANT EXECUTE ON app_owner.p_check_balance TO app_user;✅
权限生效无需重连,但间接通过角色授予的 EXECUTE 在 AUTHID DEFINER 过程中始终被忽略——这点极易被漏掉,且错误现象和对象不存在完全一致,排查时容易误判。











