ORA-00942在乔布斯

时间:2014-09-04 09:57:22

标签: oracle

我正在尝试编写一个触发器,在某些用户创建后授予角色某些权限。所以我写了一个触发器,它允许一个工作来授予这些权利(因为你不能直接在触发器中创建授权。 我的触发器看起来像这样

create or replace TRIGGER ops$test2.grant_on_creation
  AFTER CREATE ON DATABASE
DECLARE
  v_jobno PLS_INTEGER;  
  v_cnt number(1);
  v_stmt varchar2(4000);
BEGIN
  select count(*)
    into v_cnt
    from DBA_ROLES
   where role = 'ROL$'||substr(ora_dict_obj_owner, 5);
  if ora_dict_obj_owner like 'OPS$%' and v_cnt=1 and ora_dict_obj_type in ('SEQUENCE', 'PROCEDURE',  'PACKAGE',    'VIEW', 'TABLE', 'FUNCTION') then
    select 'grant '||decode(ora_dict_obj_type, 'SEQUENCE', 'SELECT', 'PROCEDURE', 'EXECUTE',  'PACKAGE', 'EXECUTE', 'VIEW', 'SELECT', 'TABLE', 'SELECT, UPDATE, DELETE, INSERT', 'FUNCTION', 'EXECUTE') ||
       ' on '||ora_dict_obj_owner||'.'||ora_dict_obj_name||' to ROL$'||substr(ora_dict_obj_owner, 5)
      into v_stmt
      from dual;
       dbms_job.submit( v_jobno,
                   'declare v_errm varchar(4000); 
                   BEGIN 
                     execute immediate '''||v_stmt||'''; 
                   exception 
                    when others then 
                      v_errm := SQLERRM ; 
                      insert into ops$test2.AT_TEST_GRANT values(v_errm); 
                      commit; 
                   END;',
                   sysdate + interval '10' second );
  end if;
END;
/

ops $ test2应具有所有必要的权限,但是当我在另一个模式中创建表时,我得到ORA-00942:表或视图不存在(在我的AT_TEST_GRANT -table中)

作业的LOG_USER,PRIV_USER和SCHEMA_USER是ops $ test2。 当我从作业中获取确切的代码并使用我的用户ops $ test2执行它时它就可以正常工作。

1 个答案:

答案 0 :(得分:0)

我只需要“向OPS $ TEST2授予任何对象特权”,如Kim Berg Hansen建议