当被授权者已经对基础表具有选择权限但授权者对这些表没有“授予”权限时,是否可以授予使用视图的权限?也就是说,被授权者是否可以使用视图的结构,但是使用自己的基础表权限而不是视图所有者的权限?
例如,我有用户A,B和C.用户A有一些表。用户B和C当前对这些表具有相同的选择权限。用户B在这些表上构建视图。用户C可以使用该视图吗?
注意:我知道如果B在这些表上给予“select with grant”权限,这可以在B的权限上运行,但我不希望B能够向前授予他们的权限;我只希望已经拥有自己权限的用户能够使用视图的结构。
上下文:我想使用A模式中的一些数据进行一些临时工作,通过B模式中已存在的视图进行查询;这涉及创建一些表来保存我想要使用的数据集,但我不想在我工作的时候用这些表弄乱B模式。我是否可以通过复制用户B对架构A的权限而不必在C架构中重新创建所有用户B的视图来以用户C的身份执行此操作?有更简单的方法吗?
答案 0 :(得分:2)
简短的回答是“不”。 documentation is quite clear:
要将视图上的SELECT授予另一个用户,您必须拥有该视图下的所有对象,或者您必须在所有这些底层对象上获得SELECT对象特权WITH GRANT OPTION。即使被授权者已经对这些基础对象具有SELECT权限,也是如此。
这是一个有效的例子。首先是拨款......
SQL> grant select on product to b;
Grant succeeded.
SQL> grant select on sales to b;
Grant succeeded.
SQL> grant select on product to c;
Grant succeeded.
SQL> grant select on sales to c;
Grant succeeded.
SQL> conn b/b
Connected.
SQL> select count(*) from a.sales;
COUNT(*)
----------
40
SQL> conn c/c
Connected.
SQL> select count(*) from a.sales;
COUNT(*)
----------
40
SQL>
现在让我们在B的架构中创建一个视图。
SQL> conn b/b
Connected.
SQL> create or replace view tot_product_sales as
2 select p.name as product_name
3 , sum(s.pieces) as units_sold
4 , sum(s.pieces * p.price) as turnover
5 from a.sales s
6 join a.product p on p.product_id = s.product_id
7 group by p.name
8 /
View created.
SQL> select * from tot_product_sales
2 /
PRODUCT_NAME UNITS_SOLD TURNOVER
------------------------------ ---------- ----------
Mobile 1161 928800
Laptop 970 1552485
SQL> grant select on tot_product_sales to c;
grant select on tot_product_sales to c
*
ERROR at line 1:
ORA-01720: grant option does not exist for 'A.PRODUCT'
SQL>
为什么Oracle安全模型会这样做?可以这样想:GRANT SELECT允许用户B用A的数据做两件事
with grant option
,允许其他用户从A表中选择数据B没有授权能够知道哪些其他用户A已授予权限。所以B不知道C对A的架构有什么特权。
解决方案?
select ... with grant option
到B(和C)?哪种解决方案最适合取决于具体方案。通常,第三个选项是一个,因为如果某些数据的特定表示有几个用例,那么数据所有者拥有该表示是有意义的。其他时候,我们有一个专用的报告模式,它可以整理,聚合和丰富来自多个模式的数据,在这种情况下,第一个选项是一个。
您的情况似乎不适合这些情况,因此似乎复制模式C中的视图是您最好的网络。