1

一开始,应用程序有一个adminsandemployeesrecords

记录表有许多列,任何员工都无法更改。但是,无法提交此更改。当管理员批准编辑时,记录将再次显示在系统中。

我试图识别列名和值,并使用 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

4

2 回答 2

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演示

于 2013-09-28T03:10:42.093 回答
0

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

于 2013-09-28T04:11:21.887 回答