授予表选择

时间:2018-09-17 23:19:55

标签: oracle select grant

我正在尝试在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前缀。

谢谢!

2 个答案:

答案 0 :(得分:4)

是的,一定是那样的。假设USER_3也做了GRANT SELECT ON USER3.ITEMS TO USER_2。您希望ITEMS是谁的USER_2表来查看他是否可以运行SELECT * FROM ITEMS?这将是模棱两可的。

为避免此类歧义,当USER_2SELECT ... 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表中的数据。

P.S。如果要授予某人对表的只读访问权限,则应授予READ特权,而不是SELECT特权。 SELECT特权包括SELECT..FOR UPDATE的功能,可以在您的数据上创建锁定,从而有可能破坏被授权写入表的用户。

答案 1 :(得分:1)

如果您不限定表名(以USER_2身份登录时),则您(这里是理想的“ you”!)唯一可以访问的表是USER_2模式中的表,或有人为其创建同义词的表。

这是应该的。授予允许USER_2访问该表,但不创建同义词(请参阅文档中的概念)。考虑一下:USER_4和USER_5可能都具有名为TBL的表(在它们自己的模式中)。他们都可以授予USER_2访问权限。那么,那么当USER_2毫无限制地引用“ TBL”时,哪个表才是真正的意思?