更新现有记录时,是否从实体化视图中删除然后重新插入?
我的问题是我更新了现有记录并且正在执行触发器。我只希望为新记录触发此触发器。
我正在使用Oracle物化视图。我有一个触发器:
create or replace trigger my_view_trigger
after insert on my_materialized_view
for each row
begin
--handle new record
end;
我也尝试将“插入后”部分更改为“插入或更新后”,并在开始块中有一个正文:
if inserting then
--handle new record
elseif updating then
--handle modification of existing record
end if;
但每次更新都被视为插入内容。有没有办法在物化视图中检测更新?
答案 0 :(得分:0)
您是否考虑过物化视图日志?监视表周围有许多种子功能,物化视图依赖于使用物化视图日志文件(为此目的明确设计)。
例如,我有一个Oracle Apps表的日志文件,inv.mtl_system_items_b 接下来,如果我想监视对表的DML更改,我只查询日志文件:
SELECT m_row$$
FROM INV.MLOG$_MTL_SYSTEM_ITEMS_B
WHERE DMLTYPE$$ = 'I'
AND SNAPTIME$$ >= TRUNC(sysdate));
日志文件使用列DMLTYPES $$(I表示插入,U表示更新,...)跟踪DML类型。
现在假设我想知道今天插入的确切记录,我可能会这样做:
SELECT *
FROM INV.MTL_SYSTEM_ITEMS_B
WHERE rowid IN
(SELECT m_row$$
FROM INV.MLOG$_MTL_SYSTEM_ITEMS_B
WHERE DMLTYPE$$ = 'I'
AND SNAPTIME$$ >= TRUNC(sysdate)
)
然后,可以使用查询物化视图所依赖的这些表的查询的某些变体来修改您的触发器。利用这种种子功能非常有价值(无需重新创建轮子)。
关于物化视图上的触发器,存在一些问题:
-Oracle通常建议不要这样做(参见触发器文档),除了可更新的物化视图。
- 实例化视图中的行更新可能以DELETE + INSERT
完成请参阅Tom Kyte关于此的文章(https://asktom.oracle.com/pls/apex/f?p=100:11:0::::P11_QUESTION_ID:672989600346945045)。
一般来说,这是不鼓励的。