【问题标题】:TRIGGER with INSERT AND UPDATE使用插入和更新触发
【发布时间】:2012-04-13 17:46:51
【问题描述】:

我需要有关在我的 table1 上创建触发器的帮助,该触发器会将特定列从 table1 插入到 table2。我怎样才能做到这一点?我正在使用 Oracle 11G XE。

这是我的代码:

create or replace trigger AllowanceTrigger
after insert on ex_bulacan
for each row
begin
    insert into allowance (PLANT_ORIGIN,SO_NO, SO_STATUS,SO_REMARKS,DRIVER_NAME)
    values (:new.plant_origin, :new.sales_order_no, :new.status,:new.remarks, :new.driver_name);
end; ​

如果他们更新ex_bulacan 中的数据怎么办?也会自动更改我的allowance 表吗?

【问题讨论】:

  • 更新时不会改变,因为你的触发器只有after insert

标签: sql oracle11g oracle-apex plsqldeveloper


【解决方案1】:

不,您需要这样定义的触发器:

在插入或更新后创建或替换触发器 AllowanceTrigger.....

或者您可以创建两个触发器 - 一个用于插入,一个用于更新

【讨论】:

    【解决方案2】:

    正如@e-bacho 2.0 的 cmets 中所述,更新期间不会发生任何事情。 您还必须为after update 事件指定触发器。或实现您的实际触发器来处理更新

    【讨论】:

    • Justin Cave 的回答应该能满足你的需要
    【解决方案3】:

    没有。如果您希望触发器在ex_bulacan 有更新时触发,则需要同时定义触发器after insertafter update。如果你想更新allowance 表,你会想要类似

    create or replace trigger AllowanceTrigger
    after insert or update on ex_bulacan
    for each row
    begin
      if( inserting )
      then
        insert into allowance (PLANT_ORIGIN,
                               SO_NO, 
                               SO_STATUS,
                               SO_REMARKS,
                               DRIVER_NAME)
        values (:new.plant_origin, 
                :new.sales_order_no, 
                :new.status,
                :new.remarks, 
                :new.driver_name);
      end if;
    
      if( updating )
      then
        update allowance
           set plant_origin = :new.plant_origin,
               so_status = :new.status,
               so_remarks = :new.remarks,
               driver_name = :new.driver_name
         where so_no = :new.sales_order_no;
      end if;
    end; ​
    

    也就是说,拥有两个具有相同数据集的表强烈意味着您遇到了不正确的规范化问题。修复数据模型通常比尝试通过触发器使两个表中的数据保持同步要好得多。

    【讨论】:

    • 好的,我要试试你的代码。如果 ex_bulacan 中的 SO_NO 已经在配额表中,我想要什么,它将自动更新配额表中的数据。谢谢!!
    • i got this error master please help about this"Compilation failed, line 23 (12:26:16) 与编译错误相关的行号是相对于第一个BEGIN语句的,这只影响编译数据库触发器。” PLS-00103:遇到符号“;”预期以下情况之一时:如果
    • @MichaelPilapil - 你看到我为修复丢失的END IF 所做的编辑了吗?如果要根据so_no 更新allowance 表,则第二个UPDATE 中的WHERE 子句需要引用so_no。我猜这意味着你也想UPDATEplant_origin 列。
    • 实际上先生@JustinCave 只有so_no thai 不会改变那是我两个表的唯一键我该怎么做?请帮帮我先生..
    • @MichaelPilapil - 更新了我的答案以使用 so_no 作为键而不是 plant_origin
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2016-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多