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