【问题标题】: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。你希望谁的ITEMSUSER_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”时,真正指的是哪个表?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-12-18
        • 2017-07-06
        • 2016-08-17
        • 1970-01-01
        • 2014-08-10
        • 2019-04-13
        • 1970-01-01
        相关资源
        最近更新 更多