识别数据库中已编辑的列

时间:2013-09-26 13:30:21

标签: mysql triggers

一开始,该应用程序包含adminsemployees以及records

记录表的列数多于任何员工都可以更改的列数。但是,此更改无法提交。当管理员批准编辑时,记录将再次出现在系统中。

我试图识别列名和值,并使用UPDATE上的触发器将其发送到另一个表。

因此,当员工编辑任何记录时,系统将禁用该记录。管理员也可以知道哪些值已被更改。

这在数据库中是否可行?

Records Table
-------------------------------------------------------------------
record_id       record_name     record_serial       record_active
-------------------------------------------------------------------
    1            something          5151                 YES

当对record_serial进行更新时,例如从5151到9844,我需要这样做。

Records_changes
-------------------------------------------------------------------
change_id          record_col       record_old_val      record_new_val
-------------------------------------------------------------------
    1            record_serial          5151                 9844

同时

-------------------------------------------------------------------
record_id       record_name     record_serial       record_active
-------------------------------------------------------------------
    1            something          9844                 NO

我可以使用我的应用程序来完成它,但如果无论如何使用数据库来做它会更好。

我将使用它来跟踪更改,并为记录旧值创建历史记录。

我正在使用MySQL

2 个答案:

答案 0 :(得分:1)

你可以做这样的事情

DELIMITER $$
CREATE TRIGGER tg_bu_records
BEFORE UPDATE ON records
FOR EACH ROW
BEGIN
  IF NOT (OLD.record_serial <=> NEW.record_serial AND
          OLD.record_name <=> NEW.record_name) THEN
    SET NEW.record_active = 0;
  END IF;
END$$

CREATE TRIGGER tg_au_records
AFTER UPDATE ON records
FOR EACH ROW
BEGIN
  IF NOT (OLD.record_serial <=> NEW.record_serial) THEN
    INSERT INTO records_changes (record_col, record_old_val, record_new_val)
    VALUES ('record_serial', OLD.record_serial, NEW.record_serial);
  END IF;
  IF NOT (OLD.record_name <=> NEW.record_name) THEN
    INSERT INTO records_changes (record_col, record_old_val, record_new_val)
    VALUES ('record_name', OLD.record_name, NEW.record_name);
  END IF;
END$$
DELIMITER ;

注意:诀窍是更改record_active触发器中的BEFORE标志,因为这是唯一可以更改正在更新/插入表中的行的值的事件您在其上定义了该触发器。现在在AFTER触发器中,我们记录已经进行的更改。

这是 SQLFiddle 演示

答案 1 :(得分:0)

如果我正确理解您的问题,一个好的数据库模式是使用版本化的行。您可以使用元数据添加列(或其他引用的表),这些元数据关于编辑的时间/人物/内容。编辑记录时,会插入一个新行。以前的版本永远不会被修改或删除。然后由您的应用程序逻辑决定如何处理所有这些。