2013-03-21 141 views
0

我試圖創建在一個表上欄的更新運行,然後在一定的價值觀另一臺填補了DB2數據庫的觸發器。DB2更新觸發

例如,存在與FLEET_ID柱的動力單元表。每當FLEET_ID已更改,我需要在TRANS_AUDIT表中創建一個新行。

TRANS_AUDIT架構如下:

CREATE TABLE LYNX.TRANS_AUDIT (
    TA_ID INTEGER NOT NULL, 
    TA_KEY_VALUE VARCHAR(100), 
    TA_TABLE_CHANGED VARCHAR(40), 
    TA_FIELD_CHANGED VARCHAR(40), 
    TA_OLD_FIELD_VALUE VARCHAR(100), 
    TA_NEW_FIELD_VALUE VARCHAR(100), 
    TA_USER_WHO_CHANGED VARCHAR(128), 
    TA_DATE_CHANGED TIMESTAMP, 
    TA_COMMENT VARCHAR(40), 
    TA_OLD_FIELD_DOUBLE DOUBLE DEFAULT 0, 
    TA_NEW_FIELD_DOUBLE DOUBLE DEFAULT 0, 
    PRIMARY KEY (TA_ID) 
); 

這裏是我到目前爲止,但我似乎無法得到它的工作,我得到一個function sequence錯誤。

CREATE TRIGGER PU_UPD_FLEETID 
AFTER UPDATE OF FLEET_ID ON PUNIT 
REFERENCING OLD AS O NEW AS N 
FOR EACH ROW 
MODE DB2SQL 
BEGIN ATOMIC 

    DECLARE 
    vTA_ID INTEGER; 

    IF(N.FLEET_ID <> O.FLEET_ID) THEN 

     SELECT MAX(TA_ID)+1 FROM TRANS_AUDIT INTO vTA_ID; --generate a unique sequential id 
      INSERT INTO LYNX.TRANS_AUDIT (TA_ID, TA_KEY_VALUE, TA_TABLE_CHANGED, TA_FIELD_CHANGED, TA_OLD_FIELD_VALUE, TA_NEW_FIELD_VALUE, TA_USER_WHO_CHANGED, TA_DATE_CHANGED, TA_COMMENT, TA_OLD_FIELD_DOUBLE, TA_NEW_FIELD_DOUBLE) 
      VALUES (TA_ID, N.UNIT_ID , 'PUNIT', 'FLEET_ID', O.FLEET_ID, N.FLEET_ID , SESSION_USER ,CURRENT TIMESTAMP , '', '0' ,'0'); 
    END IF; 
END; 
+0

我不是一個DB2的專家,但'SELECT MAX(TA_ID)+1 INTO vTA_ID;'看起來很可疑。這個陳述選擇什麼? – 2013-03-21 15:16:28

+0

我正在嘗試生成一個比TRANS_AUDIT表中的當前ID大一個的唯一ID。什麼是正確的方法來做到這一點? – azoorob 2013-03-21 15:25:43

+0

啊,我的錯誤,我不小心抄錯了,我忘了從聲明 – azoorob 2013-03-21 15:26:54

回答

0

在INSERT語句中,相信在VALUES中的第一項應該是vTA_ID,不TA_ID

分享和享受。

+0

哇,真是愚蠢的監督我的部分....感謝您的幫助! – azoorob 2013-03-21 17:46:51