2012-06-26 36 views
9

說我們有3條記錄表:orig_tab觸發僅改變值

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 22222  | 
| 3 | CC | Street3 | 33333  | 
--------------------------------------------- 

現在數據被改變:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 1 | AA | Street1 | 11111  | 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

什麼客戶想要的是更新記錄,只有更新的列(是的,我知道它沒有任何意義,但他們使用一些從20世紀70年代以來的舊系統,他們想做一些日誌記錄等)。因此,報告表應該是這樣的:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 |  |   | 44444  | 
| 3 |  | Dtreet7 |    | 
--------------------------------------------- 

這是我的嘗試:

CREATE OR REPLACE TRIGGER vr_reporting_trigger 
    AFTER UPDATE ON orig_tab 
    FOR EACH ROW 
BEGIN 
IF inserting THEN 
INSERT INTO rep_tab(pk, name, address, code) 
    SELECT :new.pk, :new.name, :new.address, :new,code FROM DUAL 
    WHERE NOT EXISTS (SELECT 1 FROM rep_tab WHERE pk = :new.pk); 
UPDATE rep_tab t SET t.name = :new.name, t.address = :new.address, t.code = :new.code 
    WHERE t.pk = :new.pk; 
ELSIF updating THEN 
IF :new.pk <> :old.pk THEN 
    UPDATE rep_tab t 
     SET t.name = :new.name, t.address = :new.address, t.code =: new.code 
     WHERE t.pk = :old.pk ; 
    END IF; 
    MERGE INTO rep_tab d 
    USING DUAL ON (d.pk = :old.pk) 
    WHEN MATCHED THEN 
    UPDATE SET d.name = :new.name, d.address = :new.address, d.code =: new.code 
    WHEN NOT MATCHED THEN 
    INSERT (d.pk,d.name, d.address, d.code) VALUES (:new.pk,:new.name, new.address, new.code); 
END IF; 
END; 

這個解決方案,我得到:

--------------------------------------------- 
| PK | Name | Address | Postal Code | 
--------------------------------------------- 
| 2 | BB | Street2 | 44444  | 
| 3 | CC | Dtreet7 | 33333  | 
--------------------------------------------- 

我知道它在插入克勞斯某處在更新聲明時,但我無法弄清楚如何根據我的要求更改此克勞斯。任何建議?

在此先感謝。

回答

20

你需要這樣的:

在一個UPDATE觸發器,列名可以用的更新 條件謂詞中指定,以確定是否命名列正在 更新。例如,假設觸發被定義爲以下:

CREATE OR REPLACE TRIGGER ... 
... UPDATE OF Sal, Comm ON Emp_tab ... 
BEGIN 

... IF UPDATING ('SAL') THEN ... END IF; 

END; 

Oracle documentation(9i)

11gR2 documentation

+4

1,但9i的文件嗎? 這是[11g版本](http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/triggers.htm#sthref771) –

+2

如果yolumn是UPDATE語句的一部分,這似乎會觸發。不僅如果價值改變。 –