问题描述
我使用触发器将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>
角色创建。
SQL>
格兰特成功了。
SQL>
触发器创建。
SQL>
创建的表。
步骤2: 以emp_user身份登录
SQL>
SQL错误: ORA-00942: 表或视图不存在
00942. 00000-“表或视图不存在”
步骤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对我来说很好; 尽管我确实需要等待一分钟以确保工作完成:
因此,我首先要添加一些intrumentation,以确保作业正确运行!
因为它在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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




