需求是这样的:将A用户的所有数据表的SELECT权限授予B用户,A用户用于数据维护与管理,B用户仅仅用于数据的查询。我知道以上的需要可以在A登录后通过 “grant select any table to B” 来实现,但此时B如果用“select * form table_name”的方式来查询则会报“表或视图不存在”,只能使用“select * from A.table_name”来查询。
根据以往的小范围的解决方法,可以在B用户中为A中的表建立同义词,例如“create synonym table_name for A.table_name”。但目前的系统中数据表数量非常多,无论是一个个建立同义词还是编写脚本创建同义词都不够方便,并且,由于系统在不同的项目中部署用户名和表名都可能存在差异,如果每次都要定义一遍同义词工作量过大。现在想知道的就是如何在授权之后,能够让被授权用户B以原表名(不包括“A.”)的语句进行查询,除了建立同义词以外还有可行的方法么?

解决方案 »

  1.   

    A用户的表,B用户去访问肯定是要用A.表名的,除非用同义词。所以从这一点上来看,楼主别偷懒了。可以这样子生成一个sql脚本:
    select 'create synonym ' || table_name ' for A.' || table_name || ';'
      from dba_tables
     where owner = 'A';然后执行这样子的一个脚本,同义词就创建好了
      

  2.   

    --试一下:conn 用户名/密码@连接串; 
    set heading off 
    set feedback off 
    select 'create synonym '|| table_name ||' for user1.' || table_name || ';' from user_tables;
    set heading on 
    set feedback on 
      

  3.   

    A用户的表,B用户访问,最好用A.表
    建立同主词太多不是办法,
    要求程序员在写程序的时候用A.表来表达访问A用户的表,我写程序那么久我也发觉这样写最好
      

  4.   

    通过授权只能按楼主写的a.那样访问,如果直接写表名,可以使用同义词!建议使用Pl/sql,相当好用!