问题描述:
用户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’的记录。我现在碰到的问题就是和上面描述类似大家有没有碰到过这个情况,都快疯了,给些建议,不胜感激!
用户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’的记录。我现在碰到的问题就是和上面描述类似大家有没有碰到过这个情况,都快疯了,给些建议,不胜感激!
create or replace synonym 001.TABLE_A for TABLE_A1;
create or replace synonym 002.TABLE_A for TABLE_A2;
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数据的可能性有没有,发现自己测试下来没有发现.
各位大侠有建议吗,我们的程序中和上述方式测试过程(基本一模一样),但是发现同义词有混乱现象*/
create or replace synonym USERA.TABLE_A for TABLE_A2;
在一个procedure里,是前面部分和后面部分用到的同一个同义词会指向不同的表。 authid current_user 和 全数字的用户名 是否会有bug