在具有预先存在的表权限的用户之间共享Oracle视图

时间:2016-12-19 20:36:41

标签: oracle permissions views

当被授权者已经对基础表具有选择权限但授权者对这些表没有“授予”权限时,是否可以授予使用视图的权限?也就是说,被授权者是否可以使用视图的结构,但是使用自己的基础表权限而不是视图所有者的权限?

例如,我有用户A,B和C.用户A有一些表。用户B和C当前对这些表具有相同的选择权限。用户B在这些表上构建视图。用户C可以使用该视图吗?

注意:我知道如果B在这些表上给予“select with grant”权限,这可以在B的权限上运行,但我不希望B能够向前授予他们的权限;我只希望已经拥有自己权限的用户能够使用视图的结构。

上下文:我想使用A模式中的一些数据进行一些临时工作,通过B模式中已存在的视图进行查询;这涉及创建一些表来保存我想要使用的数据集,但我不想在我工作的时候用这些表弄乱B模式。我是否可以通过复制用户B对架构A的权限而不必在C架构中重新创建所有用户B的视图来以用户C的身份执行此操作?有更简单的方法吗?

1 个答案:

答案 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的数据做两件事

  • 从A表中选择数据
  • with grant option,允许其他用户从A表中选择数据

B没有授权能够知道哪些其他用户A已授予权限。所以B不知道C对A的架构有什么特权。

解决方案?

  1. 授予select ... with grant option到B(和C)?
  2. B和C创建重复的视图
  3. A创建视图并授予对B和C
  4. 的选择权

    哪种解决方案最适合取决于具体方案。通常,第三个选项是一个,因为如果某些数据的特定表示有几个用例,那么数据所有者拥有该表示是有意义的。其他时候,我们有一个专用的报告模式,它可以整理,聚合和丰富来自多个模式的数据,在这种情况下,第一个选项是一个。

    您的情况似乎不适合这些情况,因此似乎复制模式C中的视图是您最好的网络。