2016-02-23 33 views
2

我想寫一個觸發器,可以簡化記錄更新時的日誌記錄更改。我有一個存儲過程,它的INSERT的記錄表格名爲log_update,並且沒有工作了1場觸發:使用觸發器的差異通用日誌記錄

​​

它是一種方法,使這種更通用的領域像提供名單:

('motherFirstName', 'motherLastName', 'fatherFistName', ....) 

並通過此列表循環遍歷單個IF語句的參數?

編輯:

我想出了這樣的循環:

DROP TRIGGER IF EXISTS `parents_update`; 
DELIMITER $$ 
CREATE TRIGGER `parents_update` AFTER UPDATE ON `parents` 
FOR EACH ROW 
BEGIN 
    DECLARE _fieldName VARCHAR(25); 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE fieldsCursor CURSOR FOR SELECT fieldName FROM log_fields WHERE tableName = 'parents'; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN fieldsCursor; 

    the_loop : LOOP 
     FETCH fieldsCursor INTO _fieldName; 
     IF done THEN 
      LEAVE the_loop; 
     END IF; 

     -- _fieldName will contain values such 'motherLastName' 
     IF (NEW (_fieldName) != OLD (_fieldName)) THEN 
      CALL log_update('parent', NEW.id, 4, CONCAT(OLD (_fieldName), ' > ', NEW (_fieldName))); 
     END IF; 
    END LOOP the_loop; 

    CLOSE fieldCursor; 
END; 
$$ 
DELIMITER ; 

其中表log_fields將包含字段進行檢查。如果字段名稱在變量中,現在我正面臨着如何訪問NEW.OLD.屬性的問題。

+0

您可以在兩個單獨的參數中只發送OLD和NEW值嗎?讓'log_update'存儲過程確定它是相同還是不同。如果不同,請存儲。如果相同,則什麼也不做。它會像'log_update(table,id,field,old,new)' – Tin

+1

我會考慮編寫一個腳本來插入帶硬編碼字段的觸發器(例如,對腳本中配置的每個字段重複if),它是方式更有效率,您仍然可以快速集中地進行更改。每次更改後,您只需重新運行腳本。 –

回答

1

我會說你可以使用準備好的語句來實現它,但不幸的是它不支持觸發器。

你可以閱讀更多關於它在這裏:http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html或答案在這裏:Alternative to using Prepared Statement in Trigger with MySQL

這意味着你不能在你的trigger這同樣適用於NEW.OLD.變量DINAMIC構建創建動態SQL查詢,所以唯一的辦法是爲每個表創建單獨的觸發器,並逐個列出所有列名稱