2013-11-01 16 views
0

在oracle 11g中,我有一个包含应用程序所需的相关表的所有者模式。选择对所有表的访问

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

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

登录到原来的模式中的后,我跑以下(用于演示我对所有表给选择)

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; 

感谢

回答

0

可以为用户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; 
+0

,我得到空行。即使SELECT * FROM USER_TAB_PRIVS用户B给出的空行 – cableload

+0

对不起,我在做它通过角色......所以选择*来自role_tab_privs的作品! – cableload

+0

@cableload谢谢,由于某种原因没有注意到角色问题。我相应地修改了我的答案。 – Mureinik

0

,如果你只是由用户B拥有的表读数据,您可以设置以下命令,然后运行SELECT表上,如果他们在用户A模式:

alter session set current_schema=userB 

(记录为用户A

然后下面两个命令将相当于(具有相同的结果):

select ... from userB.TABLE1 

select ... from TABLE1 
0
GRANT SELECT ANY TABLE TO YOUR_USER_OR_ROL; 
当我运行上面的选择为用户B