2013-05-16 35 views
0

我有兩個表emp & copy_emp具有相同的結構和相同的數據。 我想如果emp發生任何變化應該反映在copy_emp。 因此我創建了一個觸發器,我在下面給出。用於更新的PL/SQL TRIGGER

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表中更新。請幫忙。

+0

物化視圖似乎是一個更好的選擇。 –

回答

3

觸發器不點火,因爲你需要在這樣的聲明的update of部分enamesal列...

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

然而,當前的if/else邏輯,只有一列將即使更新聲明包含多個列 - 哪一個匹配第一個if將得到更新。您可以將if/else更改爲一系列if,但這會導致多個更新運行。所以,除非你有一個不尋常的要求,否則你可能想要使用@Glenn的解決方案。

3

如果多列一次更新會怎樣?您可能只想捕獲所有更新:

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;