为PostgreSQL数据库运行所有查询创建UNDO函数

时间:2013-01-04 14:02:06

标签: sql database postgresql

我正在经营精益创业公司。虽然我们对硬件故障具有良好的安全性,但我们经常需要通过直接在实时数据库上运行SQL查询来操纵客户数据。它很容易出错(比如你在测试数据库上运行删除查询,而实际上是直接在实时数据库上运行查询)。我想知道我是否可以为每个针对数据库运行的SQL查询创建“撤消”功能(如果有人通过PSQL直接连接)。我不关心性能,也不关心存储空间,因为安全数据是我唯一关注的问题。

如果UNDO功能有可能不撤消交易日志中的某些特定交易,那将是非常好的,因此倒退不会干扰正确的交易,例如新客户注册。我们拥有非常少量的此类交易,因此可以手动查看它们而不会出现问题。

1 个答案:

答案 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; //

使用此信息,您可以撤消每个更改,并将其设置回特定日期。