【问题标题】:Create Trigger to update another table in change of value创建触发器以更新另一个表以更改值
【发布时间】:2014-10-22 18:35:07
【问题描述】:

我有两个表 TABLE_A 和 TABLE_B。我在 TABLE_A 中有一个名为 ID 的值。该值由 cron 作业每 30 分钟更新一次。我需要创建一个触发器,TABLE_B 仅在它被更改时才存储 ID 的旧值和新值。 cron 作业会更新 TABLE_A 并且无法更改。

例子:

如果 ID 的值从 18 变为 19,那么它应该添加到 TABLE_B。当它从 18 变为 18 时,应该不会。

我不确定是否需要使用触发器 + 过程或只能使用触发器?

【问题讨论】:

    标签: sql database oracle triggers


    【解决方案1】:

    您可以对触发器进行编码以查看旧值和新值

    CREATE OR REPLACE TRIGGER trigger_name
      AFTER UPDATE ON table_a
      FOR EACH ROW
    BEGIN
      IF( :new.id != :old.id )
      THEN
        <<something changed>>
      END IF;
    END;
    

    如果id 可以是NULL,则需要稍微复杂一点的条件。

    【讨论】:

    • +1 由于 OP 只对“id”列的 UPDATE 感兴趣,我会将第二行修改为 AFTER UPDATE OF id ON table_a 以提高清晰度(也许还有性能?)
    • 非常感谢。奇迹般有效。 :) 还有一个问题,“每一行”这样的东西是否适用于批量更新还是会失败?
    • @AnujaKhemka - 触发器将为修改的每一行触发,无论更改的行数如何。如果您正在进行批量更新,基于触发器的解决方案可能会由于 SQL 和 PL/SQL VM 之间的所有转换而产生一些有意义的性能开销。
    • @JustinCave:是的,我正在进行批量更新。对于这种情况,您会推荐什么?
    • @JustinCave 还有一件事,如果 id 可以为空,我是否必须在“if”块中添加特殊条件(比如它不为空然后比较?)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-23
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 2021-12-25
    • 1970-01-01
    相关资源
    最近更新 更多