问题描述:
用户USERA下面有3张表,分别为TABLE_A, TABLE_A1,TABLE_A2,都只有一个字段value;一个包pkg_t, pkg_t是 authid current_user.
pkg_t中有个过程DONE,做的insert into TABLE_A(value) values(user());的操作
现在创建2个用户分别是001,002(都是数字的)。把pkg_t的执行权限赋给001,002。接下来建立私有同义词
create or replace synonym 001.TABLE_A for TABLE_A1;
create or replace synonym 002.TABLE_A for TABLE_A2;

现在测试如下:
用用户001执行pkg_t.done(); 正常情况下是应该在USERA.TABLE_A1里查一条记录的
用用户002执行pkg_t.done(); 正常情况下是应该在USERA.TABLE_A2里查一条记录的用这两个用户不停的执行这个过程,发现有数据错乱的现象.在USERA.TABLE_A2发现value=‘001’的记录。我现在碰到的问题就是和上面描述类似大家有没有碰到过这个情况,都快疯了,给些建议,不胜感激!

解决方案 »

  1.   

    你的权限是怎么赋的,pkg_t是那个用户创建?如果pgk_t是用户usera创建的那么done是insert into TABLE_A(value) values(user());的话这里的table_a是针对于usera的schema里的对象,所以你这里的pkg_t.done(); 都应该是操作的usera的schema里的table_a对象。你是用什么用户执行的这两个create语句。
    create or replace synonym 001.TABLE_A for TABLE_A1; 
    create or replace synonym 002.TABLE_A for TABLE_A2; 
      

  2.   

    下面是测试代码,都是用用户USERA登入操作
    create table table_a 
    (value varchar2(50));create table table_a1 
    (value varchar2(50));create table table_a2 
    (value varchar2(50));create user "001" identified by a;
    grant resource,connect to "001";create user "002" identified by a;
    grant resource,connect to "002";grant insert,select,delete,update on usera.table_a1 to "001";
    grant insert,select,delete,update on usera.table_a2 to "002";create synonym "001".table_a for usera.table_a1;
    create synonym "002".table_a for usera.table_a2;--建立包
    create or replace package pkg_t authid current_user is  procedure done;end pkg_t;
    /
    create or replace package body pkg_t is
      procedure done
      is
      begin
           insert into table_a values(user);
      end;
    end pkg_t;
    /--赋权,同义词
    create public synonym pkg_t for usera.pkg_t;
    grant execute on pkg_t to "001";
    grant execute on pkg_t to "002";
    ---下面开始测试(sqlplus中)
    conn 001/a;
    exec pkg_t.done;
    commit;
    select * from usera.table_a1;
    conn 002/a;
    exec pkg_t.done;
    commit;
    select * from usera.table_a2;
    /*正常结果是usera.table_a1都是001,usera.table_a2里都是002,
    现在问题是usera.table_a1中存在002数据的可能性有没有,发现自己测试下来没有发现.
    各位大侠有建议吗,我们的程序中和上述方式测试过程(基本一模一样),但是发现同义词有混乱现象*/
      

  3.   

    值得思考,但这种authid 特殊语法尽可能少用.
      

  4.   

    create or replace synonym USERA.TABLE_A for TABLE_A1; 
    create or replace synonym USERA
    .TABLE_A for TABLE_A2; 
      

  5.   

     请看完成测试脚本。该测试脚本我在两个用户分别建立了30个job,一秒钟一次执行。已经执行了100多万了 没发现问题。 但是现在的系统中确实存在
     在一个procedure里,是前面部分和后面部分用到的同一个同义词会指向不同的表。  authid current_user 和 全数字的用户名 是否会有bug