【问题标题】:Grant Select on Table在表上授予选择
【发布时间】:2018-09-17 23:19:55
【问题描述】:
我正在尝试在 Oracle 中设置 User_2,并让 User_1 授予该用户对表的 SELECT 权限。无论我做什么,创建一个角色并将选择授予该角色,或者直接授予 User_2 SELECT,我得到的只是“表或视图不存在”。但是,如果我使用 DB Owner 限定表名,我会得到我的选择。
例如,User_1.Items 被授予 SELECT 给 User_2。如果我随后查询 SELECT * FROM ITEMS,我会收到错误消息。
但是,如果我尝试SELECT * FROM USER_1.ITEMS,我会很好。必须这样吗?我认为授权暗示了 User_1 前缀。
谢谢!
【问题讨论】:
标签:
oracle
select
sql-grant
【解决方案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 的命名空间。
如果您希望USER_2 命名空间中的ITEMS 指向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 的能力,在您的数据上创建锁,可能会破坏有权写入表的用户。
【解决方案2】:
如果您不限定表名(以 USER_2 身份登录时),您(这里是理想化的“您”!)可以访问的唯一表是 USER_2 架构中的表,或者有人为其创建了同义词的表.
这是应该的。该授权允许 USER_2 访问该表,但它不会创建 同义词(请参阅文档中的概念)。想一想:USER_4 和 USER_5 可能都有名为 TBL 的表(在它们自己的模式中);他们都可以授予对 USER_2 的访问权限。那么,当 USER_2 不加限定地引用“TBL”时,真正指的是哪个表?