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

Posted

技术标签:

【中文标题】在具有预先存在的表权限的用户之间共享 Oracle 视图【英文标题】:Sharing Oracle views between users with preexisting table permissions 【发布时间】:2016-12-19 20:36:40 【问题描述】:

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

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

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

上下文:我想使用 A 模式中的一些数据做一些临时工作,这些数据通过 B 模式中已经存在的视图进行查询;这涉及创建一些表来保存我想要使用的数据集,但我不想在工作时将 B 模式与这些表混淆。我可以通过仅复制用户 B 对模式 A 的权限来作为用户 C 执行此操作,而不必在 C 模式中重新创建用户 B 的所有视图吗?有没有更简单的方法来做到这一点?

【问题讨论】:

【参考方案1】:

简短的回答是“不”。 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 的模式有什么特权。

解决方案?

    A 将select ... with grant option 授予 B(和 C)? B 和 C 创建重复视图 A 创建视图并将其上的选择授予 B 和 C

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

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

【讨论】:

以上是关于在具有预先存在的表权限的用户之间共享 Oracle 视图的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中,调用同义词报表和视图不存在。

oracle 赋予权限后,查询却显示表或视图不存在

Oracle 权限(grantrevoke)

Oracle 权限(grantrevoke)

oracle 数据库创建新用户

Oracle12C多租户管理用户角色权限