我正在尝试在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前缀。
谢谢!
是的,一定是那样。假设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
表中的数据。
附:如果您想给某人一个只读访问权限的表,那么您应该授予READ
权限而不是SELECT
权限。 SELECT
特权包括SELECT..FOR UPDATE
的能力,创建数据锁定,可能会破坏被授权写入表的用户。
如果您没有限定表名(以USER_2身份登录),那么您(理想化的“您”在这里!)可以访问的唯一表是USER_2模式中的表,或者某人创建同义词的表。
这是应该的。该授权允许USER_2访问该表,但它不会创建同义词(请参阅文档中的概念)。想一想:USER_4和USER_5可能都有名为TBL的表(在他们自己的模式中);他们都可以授予USER_2访问权限。那么,当USER_2没有资格引用“TBL”时,哪个表真正意味着什么呢?