在具有表权限的用户之间共享Oracle视图
当受让人已经对基础表具有select权限,但授予人对这些表没有“with grant”权限时,是否可以授予使用视图的权限?也就是说,被授权人是否可以使用视图的结构,但可以使用自己的基础表权限而不是视图所有者的权限 例如,我有用户A、B和C。用户A有一些表。用户B和C当前对这些表具有相同的选择权限。用户B在这些表上构建一个视图。用户C可以使用该视图吗 注意:我知道如果B在这些表上被授予“select with grant”权限,这可以在B的权限上运行,但我不希望B能够向前授予他们的权限;我只希望已经拥有自己权限的用户能够使用视图的结构 上下文:我想使用通过B模式中已有的视图查询的A模式中的一些数据做一些特别的工作;这涉及到创建一些表来保存我想要使用的数据集,但我不想在工作时用这些表来混乱B模式。作为用户C,我是否可以只复制用户B对模式A的权限,而不必在C模式中重新创建用户B的所有视图?有更简单的方法吗?简单的回答是“没有”。委员会: 若要将视图上的选择授予其他用户,您必须拥有该视图下的所有对象,或者必须已被授予所有这些基础对象上的“授予选择对象权限”选项。即使受让人已经对这些基础对象具有选择权限,这也是正确的 下面是一个成功的例子。首先是拨款在具有表权限的用户之间共享Oracle视图,oracle,permissions,views,Oracle,Permissions,Views,当受让人已经对基础表具有select权限,但授予人对这些表没有“with grant”权限时,是否可以授予使用视图的权限?也就是说,被授权人是否可以使用视图的结构,但可以使用自己的基础表权限而不是视图所有者的权限 例如,我有用户A、B和C。用户A有一些表。用户B和C当前对这些表具有相同的选择权限。用户B在这些表上构建一个视图。用户C可以使用该视图吗 注意:我知道如果B在这些表上被授予“select with grant”权限,这可以在B的权限上运行,但我不希望B能够向前授予他们的权限;我只希望已
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的数据做两件事
- 从A的表中选择数据
,允许其他用户从A的表中选择数据使用授权选项