在A用户下定义了触发器,触发器是当B用户下有存储过程的修改就调用A用户的自定义函数,函数中使用了系统包dbms_metadata.get_ddl()。
现,我在B用户下修改过程,提示ORA-31603,我猜测是没有权限导致的。
我直接在A用户下用PL/SQL测试这个函数,是可以的,函数中用了AUTHID CURRENT_USER。
AB两个用户都赋了SELECT_CATALOG_ROLE,EXECUTE ON DBMS_METADATA 也赋权了。求大神帮忙看下,不甚感激!

解决方案 »

  1.   

    1、dbms_metadata.get_ddl()包()内的参数都要大写。
    2、DBMS_METADATA.GET_DDL默认的是查看当前用户的信息,如果你以用户A来查看用户B的表要在dbms_metadata.get_ddl的第三个参数里加上表/表空间的schmea,否则就会报ORA-31603。
      

  2.   

    入参没什么问题,入参我加上了SCHEMA的
      

  3.   

    遇到ORA-31603这样的错误,大部分情况是因为使用者写错了object_type或忘记了schema参数.
      

  4.   

    真不是参数问题 TOT, 应该是权限问题,我觉得可能是定义者权限和调用者权限的原因。入参不会有问题的,不然也不会困扰辣么久了
      

  5.   

    解决方法:
    1.用户A获取用户B下的表的DDL报如下错误
     
    SQL> SELECT dbms_metadata.get_ddl('TABLE','TB_TEST','USER_B') FROM dual;
     
    ERROR:
     
    ORA-31603: object "TB_TEST" of type TABLE not found in schema "USER_B"
     
    ORA-06512: at "SYS.DBMS_SYS_ERROR", line 105
     
    ORA-06512: at "SYS.DBMS_METADATA", line 2805
     
    ORA-06512: at "SYS.DBMS_METADATA", line 4333
     
    ORA-06512: at line 1
     
       www.2cto.com  
     
    2.查看用户A用户的权限
     
    column Grantee format a10;
     
    column Privilege format a25;
     
    column Type format a5;
     
    Select Pri.Grantee,
     
           Pri.Privilege,
     
           Pri.Admin_Option,
     
           Case
     
             When Type = '1' Then
     
              'Privs'
     
             When Type = '2' Then
     
              'Role'
     
           End Type
     
      From (Select Sp.Grantee, Sp.Privilege, Sp.Admin_Option, '1' Type
     
              From Dba_Sys_Privs Sp  www.2cto.com  
     
            Union All
     
            Select Rp.Grantee, Rp.Granted_Role, Rp.Admin_Option, '2' Type
     
              From Dba_Role_Privs Rp) Pri
     
     15   Where Pri.Grantee = 'USER_A';
     
    GRANTEE    PRIVILEGE                 ADM TYPE
     
    ---------- ------------------------- --- -----
     
    USER_A     EXECUTE ANY PROCEDURE     NO  Privs
     
    USER_A     UNLIMITED TABLESPACE      NO  Privs
     
    USER_A     CONNECT                   NO  Role
     
    USER_A     RESOURCE                  NO  Role
     
     
     
    发现用户没有select_catalog_role该角色,授予该角色给用户A
     
    grant select_catalog_role to USER_A;
     3.再次获取用户B下的表的DDL
     
    SQL> set long 999999999;
     
    SQL> SELECT dbms_metadata.get_ddl('TABLE','TB_TEST','USER_B') FROM dual;
     
    DBMS_METADATA.GET_DDL('TABLE','TB_TEST','USER_B')  www.2cto.com  
     
    --------------------------------------------------------------------------------
     
      CREATE TABLE "USER_B"."TB_TEST"
     
       (    "ID" NUMBER NOT NULL ENABLE,
     
            "NAME1" CHAR(2000),
     
            "NAME2" CHAR(2000),
     
            "NAME3" CHAR(2000),
     
            "NAME4" CHAR(2000),
     
            "NAME5" CHAR(2000)
     
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
     
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
     
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
     
    DBMS_METADATA.GET_DDL('TABLE','TB_TEST','USER_B')
     
    --------------------------------------------------- 
     
    TABLESPACE "TPS_TEST"
      

  6.   

    这个问题我用create_job 的方式重构了,权限都是有的,如上面描述,只是在B用户下修改代码触发了A用户下的触发器。我看了大家的回复都是单纯的认为我在A用户下执行select dbms_metadata 查B用户下的object,其实不是这个问题,哎,谢谢大家了!