首页 > 应用开发 > IT综合 > 一个有意思的权限问题!
题意是这样的:
有3个用户test,test1,test2
test下有一表t
test1下有一个view:create view v1as select * from test.t
现在test1要把v1的select权限授予test2,需要具备什么条件?
[@more@]1、第一种想法
test用户在授予t的select 权限给test1时需要带上grant option选项以保证test1在授予v1的select权限时能保证它可以把test.t的select权限授予test2
SQL> create user test identified by test;
用户已创建。
SQL> create user test1 identified by test1;
用户已创建。
SQL> grant connect, resource to test,test1;
授权成功。
SQL> connect test/test
已连接。
SQL> create table t(id int);
表已创建。
SQL> insert into t values(1);
已创建 1 行。
SQL> commit;
提交完成。
SQL> connect test1/test1
已连接。
SQL> create view v1 as select * from test.t;
create view v1 as select * from test.t
*
第 1 行出现错误:
ORA-00942: 表或视图不存在
SQL> connect test/test
已连接。
SQL> grant select on t to test1;
授权成功。
SQL> connect test1/test1
已连接。
SQL> create view v1 as select * from test.t;
create view v1 as select * from test.t
*
第 1 行出现错误:
ORA-01031: 权限不足
SQL> connect xys/manager
已连接。
SQL> grant create view to test1;
授权成功。
SQL> connect test1/test1
已连接。
SQL> create view v1 as select * from test.t;
视图已创建。
SQL> connect xys/manager
已连接。
SQL> create user test2 identified by test2;
用户已创建。
SQL> grant connect ,resource to test2;
授权成功。
SQL> connect test1/test1
已连接。
SQL> grant select on v1 to test2;
grant select on v1 to test2
*
第 1 行出现错误:
ORA-01720: 不存在 'TEST.T' 的授权选项
SQL> connect xys/manager
已连接。
SQL> select * from DBA_TAB_privs where grantee in ('TEST','TEST1','TEST2');
GRANT OWNER TABLE GRANT PRIVIL GRA HIE
----- ----- ----- ----- ------ --- ---
TEST1 TEST T TEST SELECT NO NO
SQL> connect test/test
已连接。
SQL> grant select on t to test1 with grant option;
授权成功。
SQL> connect test1/test1
已连接。
SQL> grant select on v1 to test2;
授权成功。
--=====================================
2、第二种想法
test在授予t的select权限时不带grant option,test直接把t的select权限授予test2
SQL> connect xys/manager
已连接。
SQL> select * from DBA_TAB_privs where grantee in ('TEST','TEST1','TEST2');
GRANT OWNER TABLE GRANT PRIVIL GRA HIE
----- ----- ----- ----- ------ --- ---
TEST1 TEST T TEST SELECT YES NO
TEST2 TEST1 V1 TEST1 SELECT NO NO
SQL> connect test/test
已连接。
SQL> connect test1/test1
已连接。
SQL> revoke select on v1 from test2;
撤销成功。
SQL> connect test/test
已连接。
SQL> grant select on t to test1;
授权成功。
SQL> connect xys/manager
已连接。
SQL> select * from DBA_TAB_privs where grantee in ('TEST','TEST1','TEST2');
GRANT OWNER TABLE GRANT PRIVIL GRA HIE
----- ----- ----- ----- ------ --- ---
TEST1 TEST T TEST SELECT YES NO
SQL> connect test/test
已连接。
SQL> revoke select on t from test1;
撤销成功。
SQL> grant select on t to test1;
授权成功。
SQL> grant select on t to test2;
授权成功。
SQL> connect xys/manager
已连接。
SQL> select * from DBA_TAB_privs where grantee in ('TEST','TEST1','TEST2');
GRANT OWNER TABLE GRANT PRIVIL GRA HIE
----- ----- ----- ----- ------ --- ---
TEST1 TEST T TEST SELECT NO NO
TEST2 TEST T TEST SELECT NO NO
SQL> connect test1/test1
已连接。
SQL> grant select on v1 to test2;
grant select on v1 to test2
*
第 1 行出现错误:
ORA-01720: 不存在 'TEST.T' 的授权选项
SQL>
咋一看这个题我情不自禁的就想到了第一种,但是第二种到底好用不拿不准,通过测试发现第二种不可行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/19602/viewspace-1006644/ ,如需转载,请注明出处,否则将追究法律责任。