當某個字段發生更改時,我需要創建錶行的更改歷史記錄。所以我想要做的是在表更新上創建一個觸發器。當字段txta
發生變化時,我希望整行被複制到debug
,這是msser_210
的一個克隆版本,最後添加了datetime的列,而沒有數據。我想在更改上添加NOW()
,這樣我就可以獲得時間戳。這是我曾嘗試遠:如何爲表創建更改日誌?
DELIMITER $$
CREATE TRIGGER history_trigger
BEFORE UPDATE ON msser_210
FOR EACH ROW
BEGIN
IF OLD.txta != NEW.txta
THEN
INSERT INTO `debug_history` (`idpm`,`posn`,`prnb`,`doid`,`ofcr`,`pidm`,`hitm`,`sitm`,`item`,`dsca`,`igid`,`kitm`,`leng`,`widt`,`hght`,`thik`,`radi`,`quas`,`wght`,`effc`,`colr`,`bdat`,`edat`,`back`,`cuid`,`intb`,`aggr`,`unqu`,`oqua`,`unsq`,`stoc`,`allo`,`hall`,`tqan`,`bqan`,`pkey`,`pric`,`cvqs`,`unsp`,`disc`,`dart`,`ksid`,`anhg`,`txta`,`txti`,`mndn`, `changedate`) VALUES (OLD.idpm,OLD.posn,OLD.prnb,OLD.doid,OLD.ofcr,OLD.pidm,OLD.hitm,OLD.sitm,OLD.item,OLD.dsca,OLD.igid,OLD.kitm,OLD.leng,OLD.widt,OLD.hght,OLD.thik,OLD.radi,OLD.quas,OLD.wght,OLD.effc,OLD.colr,OLD.bdat,OLD.edat,OLD.back,OLD.cuid,OLD.intb,OLD.aggr,OLD.unqu,OLD.oqua,OLD.unsq,OLD.stoc,OLD.allo,OLD.hall,OLD.tqan,OLD.bqan,OLD.pkey,OLD.pric,OLD.cvqs,OLD.unsp,OLD.disc,OLD.dart,OLD.ksid,OLD.anhg,OLD.txta,OLD.txti, OLD.mndn, NOW());
END IF;
END;
$$
爲什麼我要做到這一點是因爲我們有(可能)與寫入相同的文本字符串到數據庫中的每一個領域,而是一個bug PHP腳本我們不知道什麼時候或爲什麼它不會發生它的腳本。有沒有更優雅的解決方案?
更新:我發現選項「修訂」在phpMyAdmin,但顯然它不會跟蹤我們的節目的PHP發行UPDATE
查詢,從PHP的DROP
和CREATE TABLE
語句雖然跟蹤。如果我通過phpMyAdmin發出UPDATE
,它會被跟蹤。長話短說,我回到原來的計劃中。
UPDATE2:找到了答案了自己
TBH程序是一個失敗的事業,我不是它的開發者,我不能代碼PHP。我是服務器SysAdmin,我被告知將所有寫入給定數據庫的日誌都記錄下來,所以開發人員可以調試(甚至沒有單元測試等),這樣很好,但幾乎沒有,我真的可以做到這一點 – siryx
這絕對沒問題。那麼我會建議我的答案仍然回答你的問題 - 「否則,觸發器是一個完全有效的工具。」堅持你提出的解決方案,那會很好。我與觸發器的經驗是由於你的情況完全相同 - 把他們放在那裏的人被迫去做。作爲更廣泛的話題的一部分,如果我處於你的位置,我會舉手(你是否有正式的基礎設施流程來接口開發人員,比如devops?),並說:「我被迫做這個,沒問題,但它會咬我們,我想要記錄下來「。 – wally
我嘗試過了,但新表中的列數量不同,因爲我爲changedate添加了一列,並且想要將其設置爲 – siryx