ITPub博客

首页 > 应用开发 > IT综合 > 一个有意思的权限问题!

一个有意思的权限问题!

原创 IT综合 作者:warehouse 时间:2008-07-03 16:47:21 0 删除 编辑

题意是这样的:

有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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2007-12-07

  • 博文量
    717
  • 访问量
    5366325