【问题标题】:Select access to all tables选择对所有表的访问权限
【发布时间】:2015-10-29 08:45:40
【问题描述】:

在 oracle 11g 中,我有一个所有者架构,其中包含应用程序所需的相关表。

对于我的外部应用程序,我正在尝试创建另一个用户,该用户应该对某些表具有对上述架构的选择访问权限。 让我们调用所有者模式 A 和新模式 B

  create user B identified by blah;
  grant connect to B;

登录到原始模式 A 后,我运行了以下命令(对于演示,我在所有表上进行选择)

  begin
  FOR x IN (select * from user_tables)
  LOOP
     EXECUTE IMMEDIATE 'GRANT SELECT ON ' || x.table_name || ' TO some_role';
  END LOOP;
  end;

  grant some_role to B;

如果我以用户 B 的身份登录并执行类似的查询

  select count(*) from A.some_table ;

它有效。但是如果不创建公共同义词,我是否可以授予 以用户 B 身份登录时以下工作的方式?

  select count(*) from some_table;

谢谢

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    您可以创建私有同义词供用户 B 使用。 以用户 B 的身份运行以下代码块:

    begin
    FOR t IN (SELECT * FROM role_tab_privs WHERE grantee = 'SOME_ROLE' and owner = 'A')
    LOOP
       EXECUTE IMMEDIATE 'CREAETE SYNONYM ' || table_name || ' FOR A.' || table_name';
    END LOOP;
    end;
    

    【讨论】:

    • 当我以用户 B 的身份运行上述选择时,我得到了空行.. 甚至 select * from user_tab_privs for user B 给出了空行
    • 对不起,我是通过角色来做的...所以 select * from role_tab_privs 有效!!
    • @cableload 谢谢,由于某种原因没有注意到角色问题。我相应地修改了我的答案。
    【解决方案2】:

    如果您只是读取 userB 拥有的表中的数据,您可以设置以下命令并在表上运行 SELECT,就好像它们在 userA 模式中一样:

    alter session set current_schema=userB
    

    (登录为 UserA

    那么下面两个命令将是等价的(结果相同):

    select ... from userB.TABLE1
    
    select ... from TABLE1
    

    【讨论】:

      【解决方案3】:
      GRANT SELECT ANY TABLE TO YOUR_USER_OR_ROL;
      

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 1970-01-01
        • 2019-01-07
        • 1970-01-01
        • 2011-03-19
        • 2014-08-18
        • 2017-07-06
        • 1970-01-01
        相关资源
        最近更新 更多