我有两张桌子emp
& copy_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
表中更新。但是当我更新ename
或sal
列时,它只会在emp
表中更新,但不会在copy_emp
表中更新。请帮忙。
答案 0 :(得分: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;
答案 1 :(得分:3)
触发器未触发,因为您需要在声明的ename
部分中包含sal
和update of
列,如下所示...
create or replace trigger t
after
insert or
update of empno, ename, sal or
delete on emp
但是,使用当前的if/else
逻辑,只有一列会更新,即使update语句包含多个列 - 与第一列if
匹配的列也会更新。您可以将if/else
更改为一系列if
,但这会导致多个更新正在运行。因此,除非您有不寻常的要求,否则您可能希望使用@Glenn的解决方案。