Sql Oracle:无法查询另一个架构的视图,该架构也将表链接到另一个架构

Sql Oracle:无法查询另一个架构的视图,该架构也将表链接到另一个架构,sql,oracle11g,Sql,Oracle11g,我在用户“dbaUserA”下创建了一个视图。视图查询使用来自另一个用户“dbaUserB”的表。两个用户都是dba 视图名称:v\u有效\u trx 质疑 Select trx_no,trx_date,order_item from trx_table a left outer join dbaUserB.cancelled_trx b on a.trx_no=b.trx_no where b.trx_no is null; 我创建了一个权限较低的用户“userC”,但启用了sel

我在用户“dbaUserA”下创建了一个视图。视图查询使用来自另一个用户“dbaUserB”的表。两个用户都是dba

视图名称:v\u有效\u trx 质疑

 Select trx_no,trx_date,order_item 
 from trx_table a left outer join  dbaUserB.cancelled_trx b on a.trx_no=b.trx_no
 where b.trx_no is null;
我创建了一个权限较低的用户“userC”,但启用了select权限

dbaUserA.trx_table
dbaUserB.cancelled_trx.
dbaUserA.v_valid_trx
我可以直接从这些不同的模式中选择trx\u table和cancelled\u trx,但是我不能在视图v\u valid\u trx上进行选择

Oracle提示

ORA-01031:权限不足 103100000-“权限不足” *原因:试图更改当前用户名或密码 没有适当的特权。如果发生以下情况,也会发生此错误: 试图在没有必要的操作系统的情况下安装数据库 系统权限。 在DBMS MAC中配置受信任的Oracle时,可能会发生此错误 如果在更高的标签上授予用户必要的权限 而不是当前登录名。 *操作:要求数据库管理员执行操作或授权 所需的特权。 对于受信任的Oracle用户,尽管已授予 在较高的标签上获得适当的权限时,请询问数据库 管理员在适当的标签处重新授予特权。第1行第21列出错

我已经和这些东西搏斗了好几个小时了。当我可以自由选择基表时,我似乎无法理解错误的原因


请帮助:)

您可以首先确认userC确实对视图dbaUserB.v\u valid\u trx拥有select权限

我相信权限存储在SYSTABLEPERMS中

我知道至少还有一个RDBMS在应用权限时从不出错,即使grant语句毫无意义

另外,我不认为您需要为基本表向userC授予select权限,这不是视图的目的吗


让我们了解您的进展情况。

当用户A将表上的权限授予用户B时,B无权向任何其他人公开该数据,即使是通过视图。必须使用带有授权选项的扩展授权语法
来允许此操作

例如,假设用户_A创建了一个表,并将其上的SELECT授予用户_B(为了弄清楚谁在运行每个命令,我让他们的SQL>提示反映他们的用户名)

这不会授予用户_B将授权传递给用户_C的权限:

USER_B> grant select on USER_A.cancelled_trx to USER_C;
                               *
ERROR at line 1:
ORA-01031: insufficient privileges
对于视图,错误消息更为具体:

USER_B> create or replace view test_view as select * from USER_A.cancelled_trx;

View created.

USER_B> grant select on test_view to USER_C
                        *
ERROR at line 1:
ORA-01720: grant option does not exist for 'USER_A.CANCELLED_TRX'
要允许这样做,所有者(用户_A)必须

USER_A> grant select on cancelled_trx to USER_B with grant option;

你的问题提出的另一点是角色的范围。对角色的授予不适用于视图或定义者权限过程。因此,如果用户A将select on cancelled_trx授予了ROLE_X,并且用户B拥有ROLE_X,那么用户B可以查询cancelled_trx,但不能在视图或存储过程中使用它。

我猜dbaUserB需要
使用grant选项将select on cancelled_trx授予dbausera,尽管在没有完整测试用例的情况下这有点猜测。dbaUserB授予dbaUserB查询它的权限,而不是与任何其他人共享它。还要注意,您对基表的命令行访问可能是通过一个角色(如DBA)进行的,该角色对视图中的基表没有任何用处。当我为视图授予权限时,我一直以sysdba的身份在控制台上。我将基础表上的select重新授予dbauserA now with grant选项。非常感谢威廉的正确猜测。:)我不知道oracle特权是这样工作的。这是oracle,所以它是
DBA | ALL | USER |选项卡_PRIVS%
视图,userC需要授予权限。
USER_A> grant select on cancelled_trx to USER_B with grant option;