0

我在下面有这个触发器,它在 emplog 表中插入新值,我想让我的触发器在描述列中插入发生的事件,例如,如果我更改了 last_name,我希望它显示为 old.lastname 更改为new.last_name,如果它是更新的名字或性别或出生日期或婚姻或社会保障号码,它应该做同样的事情,我是一个新手我怎么能做到这一点让说我想使用 concat 函数?

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog VALUES 
(NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(),('this is where the description will go')); 
4

1 回答 1

0

您可以使用select而不是values生成列列表。

您可以使用concat_ws()case 语句来比较值,从而将字符串连接在一起。以下版本假定列没有 NULL 值:

CREATE TRIGGER emplog_update AFTER UPDATE ON emp 
FOR EACH ROW 
INSERT INTO emplog  (id, lastnmae, firstname, . . .)
    select NEW.id,NEW.lastname,NEW.firstname,NEW.gender,NEW.dob,NEW.marital,NEW.SSN,'U',NULL,USER(),
           concat_ws(',',
                     (case when new.id <> old.id then 'id' end),
                     (case when new.lastname <> old.lastname then 'lastname' end),
                     (case when new.firstname <> old.firstname then 'firstname' end),
                     . . .
                    );

请注意,您应该在insertstaetment 中列出表格的列。这是保持代码可维护性的好习惯,对于触发器尤其重要。如果有人删除或重命名列,则触发器可能会在下一次更新时失败,并带有难以理解的电子邮件消息。

...用所有列的类似代码替换。

于 2013-04-24T17:55:10.547 回答