【问题标题】:Detect when a record is inserted or updated in oracle materialized view检测何时在 oracle 物化视图中插入或更新记录
【发布时间】:2014-07-05 01:11:13
【问题描述】:

更新现有记录时,是否将其从物化视图中删除然后重新插入?

我的问题是我更新了现有记录并且正在执行触发器。我只想为新记录触发此触发器。

我正在使用 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;

但每次更新都被视为插入。有没有办法在物化视图中检测更新?

【问题讨论】:

    标签: sql oracle triggers oracle11g materialized-views


    【解决方案1】:

    您是否考虑过物化视图日志?监控表有很多种子功能,具体化视图依赖于使用具体化视图日志文件(专门为此目的而设计)。

    例如,我的 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$$ 列跟踪 DML 类型(I 表示插入,U 表示更新,...)。

    现在假设我想知道今天插入的确切记录,我可能会这样做:

       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)。

    通常不鼓励这样做。

    【讨论】:

    • 对于常规表上的触发器,我能够轻松地检测到有问题的记录是插入还是更新 - 为什么它始终是物化视图的插入?
    • 您能否确认您是否有快速、完整或强制刷新您的物化视图的方法?根据您的描述,这听起来像是一种完整的方法(在刷新过程中被截断)。
    • 我对物化视图有一种快速刷新的方法。我不同意您提出的解决方案解决了我的问题,但在其他情况下我能够使用“如果更新”时,不得不去挖掘物化视图日志似乎很奇怪。
    • 查看我对答案的更新。您对导致删除+插入场景的插入的直觉可能会发生。
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 2013-05-04
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多