物化视图上创建了触发器,有问题

liuyyuns liuyyuns 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
是这样的:
由于两张基表的字段比较多,这里就不创建基表了。

--创建物化视图日志
create materialized view log on WCMMETATABLEBOOK_BASEINFO with rowid;
create materialized view log on WCMMETATABLEBOOK_EXTINFO with rowid;

--创建物化视图
create materialized view MV_BOOKEXPINFO
refresh force on demand
start with sysdate next sysdate + 5 / (24 * 60)
as
select t1.rowid as baserowid,t2.rowid as exprowid,t1.metadataid,t1.RESOURCEUNIQUEID,t1.pubdate,t1.creator,t1.issets,t1.setsname,t1.setsorder,t1.title,t2.hasflip,t2.sellprice,t2.price,t2.isbn,t2.canprint from WCMMETATABLEBOOK_BASEINFO t1,WCMMETATABLEBOOK_EXTINFO t2 where t1.RESOURCEUNIQUEID = t2.RESOURCEUNIQUEID;

--创建触发器
create or replace trigger TRI_bookexpinfo
after insert or update or delete on mv_bookexpinfo
for each row
declare
bid int;
begin
if deleting then
dbms_output.put_line('删除');
update bookexpinfo set BOOK_ISDEL='1' where BOOK_TRSID=:old.RESOURCEUNIQUEID;
end if;
if inserting then
dbms_output.put_line('插入');
select bookid.nextval into bid from dual;
insert into bookexpinfo(book_id,BOOK_TRSID,BOOK_DATE,BOOK_AUTHOR,BOOK_ISSETS,BOOK_SETSNAME,BOOK_SETSORDER,BOOK_TYPE,BOOK_NAME,BOOK_SALEPRICE,BOOK_PRICE,BOOK_ISBN,canPrint)
values(bid,:new.RESOURCEUNIQUEID,:new.PUBDATE,:new.CREATOR,:new.ISSETS,:new.SETSNAME,:new.SETSORDER,:new.HASFLIP,:new.TITLE,:new.SELLPRICE,:new.PRICE,:new.ISBN,:new.CANPRINT);
end if;
if updating then
dbms_output.put_line('修改');
update bookexpinfo set BOOK_DATE=:new.PUBDATE,BOOK_AUTHOR=:new.CREATOR,BOOK_ISSETS=:new.ISSETS,BOOK_SETSNAME=:new.SETSNAME,BOOK_SETSORDER=:new.SETSORDER,BOOK_TYPE=:new.HASFLIP,BOOK_NAME=:new.TITLE,BOOK_SALEPRICE=:new.SELLPRICE,BOOK_PRICE=:new.PRICE,BOOK_ISBN=:new.ISBN,canPrint=:new.CANPRINT where book_trsid=:old.RESOURCEUNIQUEID;
end if;
end TRI_bookexpinfo;

上面的语句是没有问题的,都可以成功创建,但是当我测试的时候,我在基本表WCMMETATABLEBOOK_BASEINFO中修改了一条数据:

SQL> update wcmmetatablebook_baseinfo set creator='bbbb' where RESOURCEUNIQUEID='B_50602850_001';

1 row updated

SQL> commit;

Commit complete

然后执行物化视图:

SQL> EXEC DBMS_MVIEW.REFRESH('MV_bookexpinfo', 'f');

删除
插入

PL/SQL procedure successfully completed

输出的结果很是诧异,找了一个下午也不知道是什么原因,这种情况会是什么原因呢?
...全文

相关推荐

基于Oracle物化视图日志的数据同步技术研究.pdf

确保一致性:通过设置触发器或定时任务,确保在源数据发生变化时,物化视图能及时得到刷新,维持数据一致性。这种技术的优势在于其灵活性和高效性。

数据资源

神通数据库常见问题解决方案

记录了神通数据库使用过程中遇到多次的几个问题,神通数据库是国产数据库(研发自航天软件子公司神舟通用),可以网查的资料比较少。但是随着信息安全意识的提高,国产数据库的地位慢慢提高了,希望神通越来越强大。如果大家遇到关于神通的问题可以留言讨论一下。

不要冗余

使用Oracle物化视图实现数据同步复制的研究与实现.pdf

同时,配置物化视图的刷新策略,可以是定时刷新或基于触发器的即时刷新。4. **物化视图的同步**:物化视图的更新可以通过两种方式实现:实时(即物化视图日志)和批量(定时任务)。

数据资源

Oracle之各类触发器的创建和使用.pdf

在实际应用中,触发器可以用来实现复杂的业务规则,确保数据一致性,或者提供审计功能。然而,过度使用触发器可能导致性能问题,因此在设计数据库逻辑时需谨慎考虑。

努力搬砖的小王

Oracle触发器表发生了变化 触发器不能读它的解决方法(必看)

总结,Oracle触发器在处理并发和自参照问题时,可以通过`PRAGMA AUTONOMOUS_TRANSACTION`来创建独立的子事务,解决“触发器不能读它的”错误。

weixin_38678550
评论 11
收藏 已收藏
分享
返回顶部
liuyyuns
基础和管理 17,377 成员 95,111 内容