我正在尝试编写一个触发器,在某些用户创建后授予角色某些权限。所以我写了一个触发器,它允许一个工作来授予这些权利(因为你不能直接在触发器中创建授权。 我的触发器看起来像这样
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执行它时它就可以正常工作。
答案 0 :(得分:0)
我只需要“向OPS $ TEST2授予任何对象特权”,如Kim Berg Hansen建议