2011-12-13 5 views
3

"監査"トリガーを維持しやすくする。次のように は実際には、BEFORE UPDATEトリガーに、ロジックは次のとおりです。すべての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 

その後:

は、このような各columを経由する簡単な方法はありますか?

私は十分明確であるかどうかわかりません。必要に応じてコメントを投稿してください。

ご協力いただきありがとうございます。

答えて

0

あなたは、あなただけの名前を通じてCURSORとループにクエリをラップすることができます

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

から列のリストを取得することができます。比較自体の

、私はあなたがトリガされますが、MySQLではプリペアドステートメントを使用することはできませんそれ

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