问题描述
我有一个 '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' 添加一个同义词,它可以工作,但是正如我所说,这不是我们的选择。
每当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中的表明确授予第三个用户权限:
您需要在对象上直接授予才能在PL/SQL中使用它们。不是通过角色:
https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:1065832643319
从您的第三个用户撤销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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【纯干货】Oracle 19C RU 19.27 发布,如何快速升级和安装?
Lucifer三思而后行
606次阅读
2025-04-18 14:18:38
Oracle RAC 一键安装翻车?手把手教你如何排错!
Lucifer三思而后行
605次阅读
2025-04-15 17:24:06
XTTS跨版本迁移升级方案(11g to 19c RAC for Linux)
zwtian
499次阅读
2025-04-08 09:12:48
Oracle数据库一键巡检并生成HTML结果,免费脚本速来下载!
陈举超
483次阅读
2025-04-20 10:07:02
【ORACLE】记录一些ORACLE的merge into语句的BUG
DarkAthena
465次阅读
2025-04-22 00:20:37
Oracle 19c RAC更换IP实战,运维必看!
szrsu
441次阅读
2025-04-08 23:57:08
【ORACLE】你以为的真的是你以为的么?--ORA-38104: Columns referenced in the ON Clause cannot be updated
DarkAthena
438次阅读
2025-04-22 00:13:51
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
432次阅读
2025-04-17 17:02:24
火焰图--分析复杂SQL执行计划的利器
听见风的声音
373次阅读
2025-04-17 09:30:30
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
362次阅读
2025-04-15 14:48:05