学无止境
分类: Oracle
2010-08-20 17:54:12
在创建视图时,假设有a、b、c 3个用户,其中a用户下有1张表,b用户下建立1个视图,基于a用户下的表,此时b用户需要对a用户的这张表具有select权限。
c用户需要查询b用户下的这张视图,c用户不但需要具有这张视图的select权限,还需要b用户可以将a用户下的表的select权限级联赋给c用户的权限,即得到a用户授权时具有with grant option。
1.创建3个用户,分别为a,b,c,默认表空间为ldy,只有用户a具有配额,3个用户均有connect角色。
SQL> create user a identified by a default tablespace ldy;
用户已创建。
SQL> create user b identified by b default tablespace ldy;
用户已创建。
SQL> create user c identified by c default tablespace ldy;
用户已创建。
SQL> grant connect to a;
授权成功。
SQL> grant connect to b;
授权成功。
SQL> grant connect to c;
授权成功。
SQL> alter user a quota 10m on ldy;
用户已更改。
SQL> grant create table to a;
授权成功。
SQL> grant create view to b;
授权成功。
2.用a用户建立表a,插入4条数据。
SQL> conn a/a
已连接。
SQL> create table a (id number(10),name varchar2(10));
表已创建。
SQL> insert into a values (1,'a');
已创建 1 行。
SQL> insert into a values (2,'b');
已创建 1 行。
SQL> insert into a values (3,'c');
已创建 1 行。
SQL> insert into a values (4,'d');
已创建 1 行。
SQL> commit;
提交完成。
3.将a表的select授权给用户b。
SQL> grant select on a to b;
授权成功。
SQL> conn b/b
已连接。
SQL> select * from a.a;
ID NAME
---------- ----------
1 a
2 b
3 c
4 d
4.在b用户下建立一个基于a.a表的视图。
SQL> create view a_view as select * from a.a where id>2;
视图已创建。
SQL> select * from a_view;
ID NAME
---------- ----------
3 c
4 d
5.将这个视图授权给用户c时,出现问题,这是由于b表无法将a.a表的权限授予别人。
SQL> grant select on a_view to c;
grant select on a_view to c
*
第 1 行出现错误:
ORA-01720: 不存在 'A.A' 的授权选项
6.在a用户下重新授权,加上with grant option,使得可以级联授权。
SQL> conn a/a
已连接。
SQL> grant select on a to b with grant option;
授权成功。
7.重新授权b用户下的视图给c用户。
SQL> conn b/b
已连接。
SQL> grant select on a_view to c;
授权成功。
8.c用户可以查询b用户的视图
SQL> conn c/c
已连接。
SQL> select * from b.a_view;
ID NAME
---------- ----------
3 c
4 d
9.在a用户下重新对b用户授权,使得b用户不能级联授权,b用户下的视图的select权限通过sysdba用户授权给c。
SQL> conn a/a
已连接。
SQL> revoke select on a from b;
撤销成功。
SQL> grant select on a.a to b;
授权成功。
10.c用户查询时,报权限不足的错误。
SQL> conn c/c
已连接。
SQL> select * from b.a_view;
select * from b.a_view
*
第 1 行出现错误:
ORA-01031: 权限不足
11.在a用户下,将表的select权限授予c,再登陆c用户,c用户仍然不能查询b用户下的视图。
SQL> conn a/a
已连接。
SQL> grant select on a to c;
授权成功。
SQL> conn c/c
已连接。
SQL> select * from b.a_view;
select * from b.a_view
*
第 1 行出现错误:
ORA-01031: 权限不足