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

Oracle 在多个模式上创建触发器的权限

askTom 2017-03-09
347

问题描述

我有一个 'normal' schema S,以及一个存储历史记录H的schema (它包含S的所有表,添加了一些审计列,但剥离了任何键)。
每当DML发生在S上时,它必须存储在H内 (如果S包含表T,并且我们插入记录,则H将包含一个表T',其中包含所有新插入的数据,带有时间戳,用户和谓词 “插入”)。
由于应用程序的性质,并且出于安全原因,我们有以下限制:
-S和H不能创建触发器
-在S和H之间没有创建同义词或授予。
现在我们需要触发器来将S上的DML复制到H上,因此解决方案是在具有DBA作用的schema D中创建触发器:
创建触发器TR_T
在S.T上插入或更新后
对于每一行
开始
插入到h.t' 值 ('INSERT',user,sysdate,: new,...);
结束;
问题是虽然
从S.T中选择 *

从h.t' 中选择 *
当从D查询时,两者都会给出结果
触发器本身不编译 (保持无效) 的原因
ORA-00942: 表或视图不存在
指向h.t'
用T' 替换它 (所以没有schema-prefix) 也不起作用
如果我为h.t' 添加一个同义词,它可以工作,但是正如我所说,这不是我们的选择。

专家解答

真的吗?!您正在创建具有DBA特权的第三个用户,因为这比在两个用户之间授予特权 “更好的安全性”?

创建第三个模式来保存您的代码可以提高安全性。但如果你授予它DBA就不会了!你给了它比它需要的更多的力量。

在任何情况下,您仍然需要对S和H中的表明确授予第三个用户权限:

grant dba to dbau identified by dbau;
grant unlimited tablespace to su identified by su;
grant unlimited tablespace to hu identified by hu;

create table su.t (
  x int 
);

create table hu.th (
  x int 
);

conn dbau/dbau

create or replace trigger trg 
before insert on su.t
for each row
begin
  insert into hu.th values (:new.x);
end;
/
sho err

LINE/COL ERROR
-------- -----------------------------------------------
2/3      PL/SQL: SQL Statement ignored
2/18     PL/SQL: ORA-00942: table or view does not exist

conn chris/chris

grant select, insert on su.t to dbau;
grant select, insert on hu.th to dbau;

conn dbau/dbau

create or replace trigger trg 
before insert on su.t
for each row
begin
  insert into hu.th values (:new.x);
end;
/
sho err

No errors.
复制


您需要在对象上直接授予才能在PL/SQL中使用它们。不是通过角色:

https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319

从您的第三个用户撤销DBA。只需授予它所需的特权!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论