我正在寫一個觸發器來跟蹤表中發生的所有更改。不幸的是,該表有150列,我想避免寫代碼中的每一列(例如new.col1,new.col2 ....),因此我在「更新觸發器後」中寫下了以下查詢:mysql觸發記錄,找到更改列
INSERT INTO logs SELECT *, NOW() FROM abc WHERE abc.id = NEW.Id;
此想法由於在更新查詢中沒有更改的數據的重複而導致多個問題。
簡而言之,我想動態地找出哪些列是更新查詢的一部分,如果這是不可能的,有沒有一種方法可以遍歷「新」行的所有列,以便我可以動態比較舊。@ colName == new。@ colName?
我已經看到了 Oracle PL/SQL: Loop Over Trigger Columns Dynamically,How to determine if anything changed in update trigger in t-sql和MySQL UPDATE trigger: INSERTing the values of the columns that actually changed。
最後一個鏈接是關閉我需要的只有一個區別,我不想在下面的語句中硬編碼列名稱,因爲我有超過100列的方式我將寫所有表中的類似觸發!
IF NEW.column1 <> OLD.column1 THEN INSERT INTO... END IF; IF NEW.column2 <> OLD.column2 THEN INSERT INTO... END IF
我一直正面臨着一個新的問題。即使我已經準備好硬編碼我所有的150列在我的觸發器,我有很難跟蹤「UpdatedBy」列!我的原始表跟蹤登錄到應用程序的人員以及通過應用程序進行最後更改的人員。不幸的是,我們的支持技術可能會直接從數據庫更改數據,而不更新「updatedBy」列,在這種情況下,我無法知道「updatedBy」是否是查詢的一部分,因此我無法設置該列當需要時爲null!我希望我在這裏有意義:) – Sap 2012-08-17 05:06:16
有道理。儘管如此,卻無能爲力。這是API和「接口」的用途。強迫「支持」人員/其他開發人員做他們應該做的事情。 – Jegsar 2015-02-20 04:55:55