格兰特选择在桌子上

问题描述 投票:1回答:2

我正在尝试在Oracle中设置User_2,并让User_1在表上授予该用户SELECT。无论我做什么,创建一个角色并授予该角色选择权,或直接授予User_2 SELECT,我得到的只是“表或视图不存在”。但是,如果我使用数据库所有者限定表名,我会得到我的选择。

例如,User_1.Items被授予SELECT到User_2。如果我然后查询SELECT * FROM ITEMS,我得到错误。

但是,如果我尝试SELECT * FROM USER_1.ITEMS,我会好起来的。这是必须的吗?我认为授权隐含User_1前缀。

谢谢!

oracle select grant
2个回答
4
投票

是的,一定是那样。假设USER_3也做了GRANT SELECT ON USER3.ITEMS TO USER_2。你会期待ITEMSUSER_2看他能不能运行SELECT * FROM ITEMS?这将是模棱两可的。

为了防止这种歧义,当USER_2执行SELECT ... FROM TABLE时,Oracle使用的表是USER_2的命名空间。

如果你想让ITEMS命名空间中的USER_2指向USER_1.ITEMS,你需要一个同义词,如下所示:

CREATE OR REPLACE SYNONYM USER_2.ITEMS FOR USER_1.ITEMS;

现在,USER_2可以运行

SELECT * FROM ITEMS

它将返回USER_1.ITEMS表中的数据。

附:如果您想给某人一个只读访问权限的表,那么您应该授予READ权限而不是SELECT权限。 SELECT特权包括SELECT..FOR UPDATE的能力,创建数据锁定,可能会破坏被授权写入表的用户。


1
投票

如果您没有限定表名(以USER_2身份登录),那么您(理想化的“您”在这里!)可以访问的唯一表是USER_2模式中的表,或者某人创建同义词的表。

这是应该的。该授权允许USER_2访问该表,但它不会创建同义词(请参阅文档中的概念)。想一想:USER_4和USER_5可能都有名为TBL的表(在他们自己的模式中);他们都可以授予USER_2访问权限。那么,当USER_2没有资格引用“TBL”时,哪个表真正意味着什么呢?

© www.soinside.com 2019 - 2024. All rights reserved.