当某个字段发生更改时,我需要创建表行的更改历史记录。所以我想要做的是在表更新上创建一个触发器。当字段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