【问题标题】:trigger compiled successfully but doesnt update触发器编译成功但不更新
【发布时间】:2013-11-28 20:33:18
【问题描述】:

我正在尝试编写一个触发器来跟踪一个表。

我有一个表 1 和表 2 。当我将数据插入表 1 时,触发器成功地将相同的数据插入表 2,但是当我更新表 1 时,表 2 仍然具有相同的数据 表格 DDL:

tab1
身份证号码(6);
信息 varhcar2(20);

tab2

身份证号(6);
信息 varchar2(20);
id_new number (6);
info_new varchar2(20);

触发器:

CREATE OR REPLACE TRIGGER tab2_logs
after INSERT or update or delete
   ON tab1
   FOR EACH ROW

DECLARE

BEGIN


IF INSERTING THEN
insert into tab2_logs (
id, info)
values (:new.id ,:new.info);

else if updating then
update tab2_logs set 
id = :old.id,
info = :old.info,
id_new = :new.id,
info_new = :new.id
 where id = :new.id;

end if;
end if;
END;

我确实在我的查询中提交并且触发器编译成功

【问题讨论】:

  • 您的 where 子句不应该检查 :old.id,因为 :new.id 还不知道吗?
  • 你的意思是把它写成 ' where id = :old.id ' ?它也没有用
  • 我认为你应该使用ELSIF
  • 我更正了 elsif ,仍然没有更新
  • TBH 你的整个逻辑有一个缺陷,因为你只能更新你的日志表一次,然后它就不起作用了,因为你正在使用一个不再存在于日志表中的新 id

标签: oracle


【解决方案1】:

我想你想做的是:
将 tab2_logs 更改为列:

id, info, id_old, info_old

然后使用下面的触发器:

CREATE OR REPLACE TRIGGER tab2_logs AFTER
    INSERT OR
    UPDATE OR
    DELETE
        ON tab1 FOR EACH ROW DECLARE BEGIN IF INSERTING THEN
    INSERT
    INTO
        tab2_logs
        (
            id,
            info
        )
        VALUES
        (
            :new.id ,
            :new.info
        );
elsif updating THEN
    UPDATE
        tab2_logs
    SET
        id       = :new.id,
        info     = :new.info,
        id_old   = :old.id,
        info_old = :old.info
    WHERE
        id = :old.id;
END IF;
END;

SQLFiddle

【讨论】:

  • 它不起作用,我删除了条件,它是一个测试表。如果条件有问题,那么它应该更新
  • 您删除了哪个条件?它对我来说是这样的,如果你的触发器和/或表格不同,那么可以在你的问题中发布整个信息,以便我可以调整我的答案。
  • 您在 DELETE 上触发了触发器,但在触发器内部您没有执行任何操作,即缺少 IF DELETING THEN。您是否在问题中提供了完整的触发代码?
【解决方案2】:

添加 dbms_output.put_line() 用于查找执行路径

--旧答案-根据最后的评论没有意义 看起来你的更新没有找到记录 int tab2_log 也许你需要改变

where id = :new.id;

where id = :old.id;

也用于记录目的更好的方式(在我看来)

create or replace trigger tab2_logs
    after insert or update or delete on tab1
    for each row
begin
    if INSERTING or updating then
        -- also need add information about time and user who change row
        insert into tab2_logs (id, info) values (:new.id, :new.info);
    end if;
end;

【讨论】:

  • 实际上在我的真实代码中它的 :old.id 不是 :new.id 并且在我的真实代码中我确实添加了它以添加更多信息 SELECT SYS_CONTEXT('USERENV','TERMINAL') 到 V_USERNAME FROM双;
  • 添加 dbms_output.put_line 用于在触发器中查找执行方式
  • 我应该在 put 行内添加触发器?像这样 dbms_output.put_line(trigername) ?
  • 我正在使用类似这样的东西 dbms_output.put_line('point 1'); dbms_output.put_line('point 2');检查执行方式。更新后看看 dbms_output 你应该明白执行方式
  • 那么添加 dbms_output 并在此之后运行更新有什么问题?也许我不明白你的问题?
猜你喜欢
  • 2014-06-19
  • 2019-12-23
  • 2017-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多