这个表存在的,单独运行 insert into bdtree(id,name,type,lev,pid,miscode,miscontent,tablename,re) 
       select bdtreeseq.nextval,bdzmc,'1','2',row.id,'GZBD_BDZDAWH',bdzbh,'变电站'
         from ngsc.GZBD_BDZDAWH;
语句是正确的,我的用户都具有dba权限。

解决方案 »

  1.   

    是权限的问题,即使a,b用户都为dba,但是要是在存储过程中访问b用户的表,还需要单独另外授权的。
    我用system/manager登录,授权
    SQL> grant select on ngsc.GZBD_BDZDAWH to gssc;
    grant select on ngsc.GZBD_BDZDAWH to gssc
                         *
    ERROR 位于第 1 行:
    ORA-01031: 权限不足
    结果报错说权限不足,为什么?
      

  2.   

    正好看到了一篇相关的文章:
    刚工作时,编写Oracle的存储过程,就知道即使一个用户被授予了DBA,但其模式下的存储过程在引用其它用户模式下的数据对象(如表)时,仍需要显式授权。当时只是记住了这个结论,也没细想为什么,最近几年已基本不编程了,所以就更没进一步关心这个问题。最近又编了一个存储过程,遇到类似的情况,兴趣使然就多查了一些资料,知道了这是与角色相关的问题。在使用定义者权限的情况下,Oracle在编译存储过程时并不检查定义者拥有的角色,只是检查其被显式授予的权限,而DBA也是一种角色,所以即使是DBA,也需要显式授权。Oracle之所以这样处理,主要是因为角色可能被授予多个用户,如果存储过程考虑角色权限,在角色权限变动时可能会引发大量存储过程失效或大量的检查工作,而角色又具有非默认性与密码保护,如果某用户在启用某非默认角色时编译了一个存储过程,那么当他注销该角色时该存储过程是否应该继续有效或被执行?如果另外一个用户更改了某角色的密码,那么其它依赖此角色的存储过程是否需要重新编译、是否还能执行?这些都是不好明确回答的问题。另外,Oracle认为角色的设计目的是管理众多的最终用户,这些用户一般不应该创建数据对象。而拥有数据对象的用户应该只有少数几个,从安全性的角度,也应该明确、显式地说明其应有的权限,而应用角色将降低这种明确性,所以多做一些显式授权的工作是值得的。See
    http://osi.oracle.com/~tkyte/Misc/RolesAndProcedures.html
      

  3.   

    我这个SQL> grant select on ngsc.GZBD_BDZDAWH to gssc;不叫显示授权吗?
      

  4.   

    我用system/manager登录是没法授权的,要使gssc用户能在存储过程里面访问ngsc用户的表,必须以ngsc用户(该用户有dba权限)登录,然后授权
    SQL> grant select on ngsc.GZBD_BDZDAWH to gssc;
    就可以了,问题解决,结贴。