1、 背景描述
昨天用户在给一个视图授权的时候出现报错“ORA-01720:不存在的授权选项”,根据报错提示,这是一个权限的问题,通过在授权时增加with grant option解决。
2、问题重新
2.1、准备三个用户
(1)HR :存在JOBS表(2)SCOTT :创建视图 hr_jobs,并授予 select 权限给 shen
(3)SHEN :无需任何操作
2.2、实验操作
HR用户操作:HR用户将JOBS表的SELECT权限授权给SCOTT用户
SQL> conn hr/hr
Connected.
SQL> grant select on hr.jobs to scott;
SCOTT用户操作:SCOTT用户将HR用户的表JOBS创建名为HR_HOBS的视图,并授权给SHEN用户,此时报错ORA-01720。
SQL> conn scott/tiger
Connected.
SQL> create or replace view hr_jobs as select t.job_id,t.job_title from hr.jobs t;
SQL> grant select on hr_jobs to shen;
grant select on hr_jobs to shen
*
ERROR at line 1:
ORA-01720: grant option does not exist for ‘HR.JOBS’
3、解决方法
SQL> conn hr/hr
Connected.
SQL> grant select on hr.jobs to scott with grant option;
Grant succeeded.
SQL> conn scott/tiger
Connected.
SQL> grant select on hr_jobs to shen;
Grant succeeded.
4、原因分析
举个例子,我有一台笔记本电脑,我授权给张三使用(SELECT权限),张三却想把我笔记本电脑卖掉(明显行不通,需要笔记本电脑的主人授权才行)。即我拥有该对象的"SELECT"权限,但我没有 ‘支配’ 该对象的权限(with grant option)
5、附上多个对象授权脚本
select (case
when t.type = ‘VIEW’ then
'GRANT SELECT ON ’ || t.owner || ‘.’ ||
t.referenced_name || ’ WITH GRANT SELECT;’
else
'GRANT EXECUTE ON ’ || t.owner || ‘.’ ||
t.name || ’ WITH GRANT SELECT;’
end)
from all_dependencies t
where t.owner = ‘SCOTT’
and t.name = ‘HR_JOBS’
and t.type in (‘VIEW’, ‘PROCEDURE’, ‘FUNCTION’, ‘PACKAGE BODY’);