2012-11-02 87 views
0

使用下面提到的觸發器,我正在跟蹤審計或更改日誌表中的生產表中的更改。我的問題是跟蹤表中的字段名稱與table1中的字段名稱不同。值是相同的,但列的名稱是不同的。使用觸發器跟蹤更改 - 備用字段名稱

問題是,觸發器中的語法必須如何更改一個字段名稱的值,並將其插入到跟蹤表中不同名稱的字段中?

感謝您的任何幫助或建議。

{

CREATE OR REPLACE TRIGGER track_change_trg 
AFTER INSERT OR UPDATE OR DELETE 
ON table1 
FOR EACH ROW 
BEGIN 
  
IF INSERTING THEN 
    INSERT INTO tracking table VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name, 
    'INSERTED', SYSDATE); 
  
ESLIF UPDATING THEN 
    INSERT INTO tracking table VALUES 
    (:new.pname, :new.p_id, :new.p_type, :new.t1name, 
    'UPDATED', SYSDATE); 
      
ELSIF DELETING THEN 
    INSERT INTO tracking table VALUES 
    (:old.pname, :old.p_id, :old.p_type, :old.t1name, 
    'DELETED', SYSDATE); 
      
    END IF; 
END; 
/

}

回答

0

這沒有什麼區別,如果列名是在主及審覈表不同。我不知道爲什麼你認爲這是一個問題 - 顯示任何錯誤可能有助於澄清您的問題,以及表定義。我可以立即看到的唯一錯誤就是拋出 - 假設tracking table中的空間是轉錄錯誤 - 是否訂單不匹配,並且您將錯誤的數據類型或大小放在列中。很難猜到你看到的是什麼。

您已省略insert語句中的可選column section,該語句通常會列出列名稱。沒有明確的列名稱列表,將根據目標表中的列順序分配值,如user_tab_columns.column_iddescribe所示。列出列以避免模棱兩可會更好。所以如果表定義發生變化(例如添加了列,所以沒有足夠的值)或者列順序在另一個環境中是不同的,那麼您不會遇到問題(這可能不應該在體面的源代碼管理下發生)。發現微不足道的錯誤也更容易。

不管怎麼說,只列出從表中你插入的列名:

INSERT INTO tracking_table (x_name, x_id, x_type, x_t1name, x_action, x_when) 
VALUES (:new.pname, :new.p_id, :new.p_type, :new.t1name, 'INSERTED', SYSDATE); 

...實際列名替換x_name等從tracking_table

+0

謝謝。我的錯誤出現了,因爲我試圖像在SELECT語句中那樣使用AS。你爲我清除它很好... –