暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

授予触发器在Oracle 12c中工作,在18c中不工作

ASKTOM 2019-06-19
306

问题描述

我使用触发器将admin schema中新创建的表上的select授予角色emp_role,该角色已授予用户emp_user。因此,emp_user可以对管理员用户创建的任何表具有选择特权。以下触发器代码在Oracle 12c中工作,但在18c中没有错误。在18c中,emp_user无法在admin创建的表上进行选择。但是在12c中,emp_user可以在admin创建的表上进行选择。我应该在18c中对代码进行任何更改吗?

步骤1: 以管理员身份登录,我创建了一个emp_role,并将角色授予用户emp_user。我还在管理架构中创建了一个触发器,将新创建的表上的select授予emp_role。


连接到:
Oracle数据库18c企业版版本18.0.0.0.0-生产
版本18.6.0.0.0
SQL>
create role emp_role;

角色创建。

SQL>
grant emp_role to emp_user;

格兰特成功了。

SQL>
create or replace TRIGGER admin.grant_sel_emp_role
         after create on admin.schema
         declare
      stm_str1 varchar2(255);
  
        l_job number;
         begin
       if ( ora_dict_obj_type = 'TABLE' )
      then
      stm_str1 := 'execute immediate "grant select on ' || ora_dict_obj_name || ' to emp_role";';
        dbms_job.submit( l_job, replace(stm_str1,'"','''') );
     end if;
end; 
 /


触发器创建。

SQL>
create table test(t number);


创建的表。


步骤2: 以emp_user身份登录


SQL>
select * from admin.test;


SQL错误: ORA-00942: 表或视图不存在
00942. 00000-“表或视图不存在”

专家解答

你确定这项工作已经完成了吗?

因为它在18c对我来说很好; 尽管我确实需要等待一分钟以确保工作完成:

select banner from v$version;

BANNER                                                                   
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production 

create role emp_role;
grant create session, emp_role to emp_user 
  identified by emp_user;
  
create or replace TRIGGER chris.grant_sel_emp_role
after create on chris.schema
declare
  stm_str1 varchar2(255);
  
    l_job number;
begin
  if ( ora_dict_obj_type = 'TABLE' ) then
    stm_str1 := 'execute immediate "grant select on ' || ora_dict_obj_name || ' to emp_role";';
    dbms_job.submit( l_job, replace(stm_str1,'"','''') );
  end if;
end; 
/

create table test ( t number );

conn emp_user/emp_user

select * from chris.test;

ORA-00942: table or view does not exist

select privilege 
from   all_tab_privs
where  table_schema = 'CHRIS'
and    table_name = 'TEST';

no rows selected

exec dbms_session.sleep ( 60 );

select * from chris.test;

no rows selected

select privilege 
from   all_tab_privs
where  table_schema = 'CHRIS'
and    table_name = 'TEST';

PRIVILEGE   
SELECT   


因此,我首先要添加一些intrumentation,以确保作业正确运行!
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论