2011-12-13 33 views
3

我希望我的「審計」觸發器更易於維護。 事實上,在更新前觸發器,邏輯如下:比較所有OLD和NEW更改的MySQL觸發器需要簡化

IF NEW.field <> OLD.field THEN INSERT INTO table SET field=OLD.field 

我檢查更改每列,因爲我不想存儲它並沒有真正更新的行不。有許多受監視的列,當我更改表(添加或刪除列)時,我必須編輯觸發器以反映新的表結構。

有沒有經過這樣每個科拉姆去一個簡單的方法:

FOR EACH COL BEGIN IF NEW.COL <> OLD.COL THEN SET changedetected=true; END IF; END 

而在此之後,使用for循環以同樣的方式來填充審計表與表的所有列?

我不知道我是否足夠清晰,如有需要請發表評論。

非常感謝您的幫助!

回答

0

您可以從

SELECT column_name 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE table_name = 'tbl_name' 
ORDER BY ordinal_position; 

得到列的列表,那麼你可以只包裹查詢到通過名稱的CURSOR和循環。

爲了比較本身,我想你可以PREPARE聲明它

SET @s = CONCAT('SELECT OLD.', col_name, ' = NEW.', col_name, ' INTO @cmp'); 
PREPARE stmt FROM @s; 
EXECUTE stmt; 
IF @cmp ... 
0

不能使用準備好的語句在MySQL觸發。

相關問題