Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在具有表权限的用户之间共享Oracle视图_Oracle_Permissions_Views - Fatal编程技术网

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

在具有表权限的用户之间共享Oracle视图,oracle,permissions,views,Oracle,Permissions,Views,当受让人已经对基础表具有select权限,但授予人对这些表没有“with grant”权限时,是否可以授予使用视图的权限?也就是说,被授权人是否可以使用视图的结构,但可以使用自己的基础表权限而不是视图所有者的权限 例如,我有用户A、B和C。用户A有一些表。用户B和C当前对这些表具有相同的选择权限。用户B在这些表上构建一个视图。用户C可以使用该视图吗 注意:我知道如果B在这些表上被授予“select with grant”权限,这可以在B的权限上运行,但我不希望B能够向前授予他们的权限;我只希望已

当受让人已经对基础表具有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的所有视图?有更简单的方法吗?

简单的回答是“没有”。委员会:

若要将视图上的选择授予其他用户,您必须拥有该视图下的所有对象,或者必须已被授予所有这些基础对象上的“授予选择对象权限”选项。即使受让人已经对这些基础对象具有选择权限,这也是正确的

下面是一个成功的例子。首先是拨款

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的表中选择数据
没有授予B知道哪些其他用户A已授予特权的权限。所以B不能知道C对A的模式有什么特权

解决方案?

  • A<代码>选择。。。是否向B(和C)授予期权
  • B和C创建重复的视图
  • A创建视图并将选择权授予B和C
  • 哪种解决方案最适合取决于具体的场景。通常第三种选择是一种,因为如果某些数据的特定表示有多个用例,那么数据所有者拥有该表示是有意义的。其他时候,我们有一个专门的报告模式,它可以整理、聚合和丰富来自多个模式的数据,在这种情况下,第一个选项就是一个

    您的情况似乎与这两种情况都不相符,因此复制模式C中的视图似乎是您的最佳选择