本帖最后由 szq_37 于 2010-03-08 19:18:30 编辑

解决方案 »

  1.   

    SQL> show user
    USER 为 "SYS"
    SQL> select count(*) from sys.all_Objects;  COUNT(*)
    ----------
         49310SQL> conn ggz/ggz
    已连接。
    SQL> show user
    USER 为 "GGZ"
    SQL> select count(*) from sys.all_Objects;  COUNT(*)
    ----------
         40685SQL> conn scott/scott
    已连接。
    SQL> show user
    USER 为 "SCOTT"
    SQL> select count(*) from sys.all_Objects;  COUNT(*)
    ----------
         40855SQL>看出区别了没?以其他用户登录,查询sys.all_Objects结果不尽相同。
    过程里与单独执行时,metadata的权限不一样。单独执行时,metadata用户权限和角色权限均可用,过程里,默认只有直接授权可用,角色继承权限无用。
    所以,过程里和单独执行看见的数据并不一样!
    强大的ORACLE!!!!!
      

  2.   

    我知道过程和单独执行的权限不一样,但是我连sysdba的都赋予给metadata了。
    过程代码如下:
    CREATE OR REPLACE Procedure Cccc As
    v_retcode varchar2(100);
    v_retinfo varchar2(100);
    v_dd int;
    Begin
      
      Insert Into ccc
        (Object_Id,
         Function_Code,
         Function_Name,
         Function_Desc,
         Version_No,
         Version_Comment,
         Last_Ddl_Time,
         Last_Dml_Time,
         Version_Created,
         Created_User,
         Created_Time,
         Audit_Status,
         Is_Valid)    Select '1003101' || To_Char(a.Object_Id),
               a.Object_Name,
               a.Object_Name,
               '0' Object_Desc,
               '1',
               '初始化版本',
               a.Last_Ddl_Time Last_Ddl_Time,
               a.Last_Ddl_Time Last_Dml_Time,
               Sysdate,
               'DM',
               Sysdate,
               '1',
               'Y'
          From sys.all_Objects a
         Where a.Object_Type = 'FUNCTION'
           And A.OWNER ='DM';
      Commit;
      Exception
      When Others Then
        v_retinfo := Sqlerrm;  
        v_retcode := 'FAIL';
    End;
    如果我单独在过程里执行一个如下的过程则无问题
    CREATE OR REPLACE PROCEDURE temp_z IS
    BEGIN
     insert into temp_zt  select * from all_objects;
     commit;
    END temp_z;
    all_object的所有数据会插入进temp_zt,我就是没搞懂为什么增加了条件数据却无法插入数据进表了
      

  3.   

    首先,SYSDBA除了让你的数据库存在安全隐患(当然,你可以说,我只是学习库。),以SYSDBA登录,即SYS用户,和metadata无任何关系。
    其次,
    CREATE OR REPLACE PROCEDURE temp_z IS 
    BEGIN 
    insert into temp_zt  select * from all_objects; 
    commit; 
    END temp_z; 
    执行后,查看temp_zt 有没有Function_Name值为属于DM用户的FUNCTION的数据,有数据不等于有属于DM用户的FUNCTION的数据!!!!!
      

  4.   

    查看了,确实如大哥所说无DM下的FUNCTION数据,那如果我想要把数据加进去是不是要将DM的FUNCTION的execute权限赋予metadata用户?
      

  5.   

    是的,这就是彻底解决的办法!要让metadata可以看见之!祝你顺利!
      

  6.   

    刚试了下,确实需要将DM下的函数的权限赋予metadata。那相同的比如ALL_SOURCE等视图也应该是这个问题吧。有没有什么快捷的方式可以将DM下的表,过程,函数,索引等等都赋予metadata用户,而不必去拼凑sql啊?
      

  7.   

    批处理拼凑
    以DM登录,执行
    select 'grant execute on '||NAME||' to metadata;' from user_source
    where type='FUNCTION';
    然后将结果拷贝出来,执行所有语句。其他对象雷同,不一一列举。
      

  8.   

    这个我知道,谢谢。没其他方法我就只有这样写了。哥们oracle很熟悉啊,小弟万分敬仰。呵呵