想要在通过查询acct_credit表,插入另外一个表user_info_oplog1.acct_credit在user1用户下,user_info_oplog表在user2用户下
2.xulie.nextval是个序列,同样是user2下面的
3.对 序列 和 user_info_oplog表 授予查询,更改权限给user1
4.在user1用户下,建立序列和user_info_oplog同义词
5.登录数据库,使用user1
6.执行如下语句INSERT INTO user_info_oplog (op_seq, dbop_date) 
SELECT xulie.nextval, sysdate
FROM acct_credit a;oracle报错:
global_names parameter must be set to TRUE for this operation为什么会发生这种错误?只要改为
INSERT INTO user2.user_info_oplog (op_seq, dbop_date) 
SELECT xulie.nextval, sysdate
FROM acct_credit a;
SQL就正常。想要知道为什么?

解决方案 »

  1.   


    1,一个用户要对另一个用户下的表进行dml操作,必须要有操作权限。2,如果想用insert into tablename的方式来进行操作的话,必须建tablename的同义词。否则就需要insert into user2.tablename的形式来操作。
      

  2.   

    大哥,你没看清我上面的话3.对 序列 和 user_info_oplog表 授予查询,更改权限给user1 
    4.在user1用户下,建立序列和user_info_oplog同义词 
    已经做了这个工作
      

  3.   

    而且非常不想要insert into user2.tablename的形式来操作。不然就不会建同义词了
      

  4.   

    http://blog.csdn.net/wh62592855/archive/2009/12/07/4960063.aspx参考一下
      

  5.   

    我试验了一下,没有出现楼主的错误。
    [TEST@ora10gr1#2009-12-08/08:30:52] SQL>select
      2  * from tab;TNAME                          TABTYPE  CLUSTERID
    ------------------------------ ------- ----------
    T1                             TABLE[TEST@ora10gr1#2009-12-08/08:31:04] SQL>create sequence seq1;Sequence created.[TEST@ora10gr1#2009-12-08/08:31:49] SQL>grant select on seq1 to test01;Grant succeeded.[TEST@ora10gr1#2009-12-08/08:32:41] SQL>grant all on t1 to test01;Grant succeeded.
    [TEST01@ora10gr1#2009-12-08/08:32:43] SQL>create synonym t1 for test.t1;Synonym created.[TEST01@ora10gr1#2009-12-08/08:33:20] SQL>create synonym seq1 for test.seq1;Synonym created.[TEST01@ora10gr1#2009-12-08/08:34:16] SQL>create table t2 as select * from t1;Table created.[TEST01@ora10gr1#2009-12-08/08:36:17] SQL>insert into t1 select seq1.nextval,'a' from t2;1 row created.
    [SYS@ora10gr1#2009-12-08/08:34:46] SQL>show parameter global_NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    global_context_pool_size             string
    global_names                         boolean     FALSE
      

  6.   


    我的  parameter global_name 是true
    难道必须更改这个吗?
      

  7.   


    我见的是公共同义词。
    而且也授权限。不过不知道是用户还是角色。直接在pl/sql执行就会报错
      

  8.   


    哦,我的这边也是false.不好意思。我再试试
      

  9.   

    SQL> show parameter global_nameNAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    global_names                         boolean     FALSE
    SQL>这个参数通常是默认的是false,通常不需要修改,在创建数据库链接的时候,如果你有特殊需求需要改动
      

  10.   

    在user1下对user2.user_info_oplog建个私有同义词,再用这个私有同义词在过程中使用试试
    不加public,就像8楼那样创建的是私有同义词
    访问公共同义词使用的是public的权限,不是用户自身的权限