1

我有两个表empcopy_emp相同的结构和相同的数据。我想如果发生的任何变化emp都应该反映在copy_emp. 因此,我创建了一个触发器,我在下面给出。

create or replace trigger t
after
insert or
update of empno or
delete
on emp
for each row
begin
case
when inserting then
  insert into copy_emp(empno,ename,sal) values (:NEW.empno,:NEW.ename,:NEW.sal);
when updating then
  if updating('empno') then
    update copy_emp set copy_emp.empno=:new.empno where copy_emp.empno=:old.empno;
  elsif updating('ename') then
    update copy_emp set copy_emp.ename=:new.ename where copy_emp.ename=:old.ename;
  elsif updating('sal') then
    update copy_emp set copy_emp.sal=:new.sal where copy_emp.sal=:old.sal;
end if;
when deleting then
  delete from copy_emp where empno = :old.empno;
end case;
end;

触发器的创建没有任何错误,并且插入和删除工作正常。问题在于更新。当我更新表中empno的列时emp,它也会在copy_emp表中更新。但是当我更新enamesal列时,它只会在emp表中更新,而不是在copy_emp表中。请帮忙。

4

2 回答 2

4

如果一次更新多个列怎么办?您可能只想捕获所有更新:

CREATE OR REPLACE TRIGGER emp_trigger
  AFTER INSERT OR UPDATE OR DELETE ON emp
  FOR EACH ROW

BEGIN

    IF INSERTING THEN

        INSERT INTO copy_emp(empno, ename, sal)
          VALUES (:NEW.empno, :NEW.ename, :NEW.sal);

    ELSIF UPDATING THEN

        UPDATE copy_emp
          SET copy_emp.empno = :NEW.empno
             ,copy_emp.ename = :NEW.ename
             ,copy_emp.sal   = :NEW.sal
          WHERE copy_emp.empno = :OLD.empno;

    ELSE

        DELETE FROM copy_emp
          WHERE empno = :OLD.empno;

    END IF;

END emp_trigger;
于 2013-05-17T01:47:50.923 回答
3

触发器未触发,因为您需要像这样在声明部分中包含enameandsal列...update of

create or replace trigger t
after
insert or 
update of empno, ename, sal or
delete on emp

但是,根据您当前的if/else逻辑,即使更新语句包含多个列,也只会更新一列 - 与第一列匹配的任何一个if都会得到更新。您可以将 更改if/else为一系列if,但这会导致运行多个更新。因此,除非您有不寻常的要求,否则您可能想要使用@Glenn 的解决方案。

于 2013-05-16T23:05:53.053 回答