我正在经营精益创业公司。虽然我们对硬件故障具有良好的安全性,但我们经常需要通过直接在实时数据库上运行SQL查询来操纵客户数据。它很容易出错(比如你在测试数据库上运行删除查询,而实际上是直接在实时数据库上运行查询)。我想知道我是否可以为每个针对数据库运行的SQL查询创建“撤消”功能(如果有人通过PSQL直接连接)。我不关心性能,也不关心存储空间,因为安全数据是我唯一关注的问题。
如果UNDO功能有可能不撤消交易日志中的某些特定交易,那将是非常好的,因此倒退不会干扰正确的交易,例如新客户注册。我们拥有非常少量的此类交易,因此可以手动查看它们而不会出现问题。
答案 0 :(得分:1)
嗯,我认为你唯一的选择就是创建一个历史表。 我是在触发器的帮助下完成的。
每次更新时,您都会为每个更改的值插入一行。
我的历史记录表看起来像这样(MySql):
CREATE TABLE IF NOT EXISTS `history` (
`id_history` INT NOT NULL AUTO_INCREMENT ,
`event` ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL ,
`table` VARCHAR(255) NOT NULL ,
`id` INT NOT NULL ,
`field` VARCHAR(255) NULL ,
`old_value` TEXT NULL ,
`datetime` DATETIME NOT NULL ,
PRIMARY KEY (`id_history`);
触发器:
CREATE TRIGGER test_table_update BEFORE UPDATE ON test_table
FOR EACH ROW
BEGIN
IF OLD.value1 != NEW.value1 THEN
INSERT INTO history VALUES(NULL, 'UPDATE', 'test_table', OLD.id_test_table, 'value1', OLD.value1, NOW());
END IF;
...
END; //
使用此信息,您可以撤消每个更改,并将其设置回特定日期。