我正在尝试在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前缀。
谢谢!
答案 0 :(得分:4)
是的,一定是那样的。假设USER_3
也做了GRANT SELECT ON USER3.ITEMS TO USER_2
。您希望ITEMS
是谁的USER_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
表中的数据。
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”时,哪个表才是真正的意思?