1 报错截图
2 解决办法
2.1 方法1:授权增加 with grant option
办法:对报错的对象授权时,增加 with grant option 即可。
1. 对于 view 对象
grant select on <schema.table_name> to <username> with grant option;
2. 对于 package、procedure、function 对象
grant execute on <schema.package_name> to <username> with grant option;
3. 若对象太多,一个一个核对太麻烦,可参考下列语句
select (case
when t.type = 'VIEW' then
'GRANT SELECT ON ' || t.referenced_owner || '.' ||
t.referenced_name || ' WITH GRANT SELECT;'
else
'GRANT EXECUTE ON ' || t.referenced_owner || '.' ||
t.referenced_name || ' WITH GRANT SELECT;'
end) 授权语句
from all_dependencies t
where t.owner = 'SCOTT'
and t.name = 'VW_JOBS'
and t.type in ('VIEW', 'PROCEDURE', 'FUNCTION', 'PACKAGE BODY');
2.2 方法2:conn system/密码@数据库 as sysdba
-- 以 sysdba 身份登录授权(不推荐,理由:权限过高)
-- 特别注意:
-- (1) 当使用非 sysdba 身份登录时,仍旧报错
-- (2) 而方法 2.1 任意使用都不会报错
SQL> conn system/system@orcl as sysdba
Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Connected as system@ORCL AS SYSDBA
SQL> grant select on scott.vw_jobs to bi;
Grant succeeded
3 原因分析
原因:我拥有 '访问' 该对象的权限,但我没有 '支配' 该对象的权限(with grant option)
举个生活案例:
(1) '房东A' 有一个房子,已经出租给 '租户B' 居住
(2) 现在 '租户B' 想把该房子卖给 '路人C'
该想法行不通('报错'),因为虽然 '租户B' 可以住('能访问'),但是却不能卖('无支配权限')
该想法行得通的前提:'房东A' 同意('授权') '租户B' 卖房子
4 错误重现
准备三个测试账户
(1) hr : 存在表 jobs
(2) scott :创建视图 vw_jobs,并授予 select 权限给 bi
(3) bi : 啥也不用干 ^_^
示例:
1. hr: grant select on hr.jobs to scott;
2. scott:
create or replace view vw_jobs as
select t.job_id,
t.job_title
from hr.jobs t;
grant select on scott.vw_jobs to bi; -- Ora-01720