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.
屬性的問題。
您可以在兩個單獨的參數中只發送OLD和NEW值嗎?讓'log_update'存儲過程確定它是相同還是不同。如果不同,請存儲。如果相同,則什麼也不做。它會像'log_update(table,id,field,old,new)' – Tin
我會考慮編寫一個腳本來插入帶硬編碼字段的觸發器(例如,對腳本中配置的每個字段重複if),它是方式更有效率,您仍然可以快速集中地進行更改。每次更改後,您只需重新運行腳本。 –