Oracle中GRANT EXECUTE必须显式指定schema名,如GRANT EXECUTE ON hr.get_employee_info TO scott;包需整体授权,不能只授包内过程;DEBUG权限仅允许查看源码,不赋予执行权。
Oracle 不会自动补全 schema,省略 schema 名直接写 GRANT EXECUTE ON proc_name TO user 一定会失败,报 ORA-00942: table or view does not exist。这不是对象不存在,而是解析时找不到该过程——因为没指定 owner。
GRANT EXECUTE ON hr.get_employee_info TO scott
GRANT EXECUTE ON get_employee_info TO scott
"Get_Employee_Info"),授权也必须严格匹配:GRANT EXECUTE ON hr."Get_Employee_Info" TO scott
想让某用户只看存储过程定义、禁止调用或修改,别给 EXECUTE,改授 DEBUG 权限。这个权限允许 SELECT 系统视图 ALL_SOURCE 或 DBA_SOURCE 中对应过程的源码,但无法 EXEC 或 ALTER。
GRANT DEBUG ON hr.get_employee_info TO report_user
SELECT text FROM all_source WHERE name = 'GET_EMPLOYEE_INFO' AND owner = 'HR' ORDER BY line 能查到内容;但 EXEC hr.get_employee_info 会报 ORA-06550 / PLS-00201
DEBUG 是对象级权限,不是系统权限,不能用 GRANT DEBUG ANY PROCEDURE(该系统权限不存在)Oracle 对包的权限控制粒度在 package level,不是 procedure level。即使你只打算让别人调用 pkg.do_something,也必须授整个包的 EXECUTE 权限,否则编译或运行都会失败。
GRANT EXECUTE ON hr.emp_pkg TO scott
GRANT EXECUTE ON hr.emp_pkg.do_something TO scott(语法错误,Oracle 不支持)SELECT 权限,否则运行时仍报 ORA-00942
授权后当前会话立刻生效,不用 DISCONNECT/CONNECT。但如果你给用户建了私有同义词(比如 CREATE SYNONYM my_proc FOR hr.get_employee_info),那用户执行 EXEC my_proc 时,Oracle 检查的是对同义词所在 schema(即当前用户)的 EXECUTE 权限,而不是对原过程 hr.get_employee_info 的权限。
EXECUTE 权限,否则同义词无法被调用CREATE PUBLIC SYNONYM get_emp FOR hr.get_employee_info,再确保所有目标用户都有 GRANT EXECUTE ON hr.get_employee_info TO ...
PLS-00201)看起来像代码问题,但根源纯属权限配置偏差。