这是维护mysql表更改的日志/审计表的合理方法吗?

时间:2010-11-14 08:48:29

标签: sql mysql triggers

我想维护我的架构中几个表的更改的日志表。 我正在尝试设置它,以便我不需要列出我的insert语句中的所有字段,所以我已经设置了日志表以具有与主表完全相同的结构 - 我只是删除了自动增量/主键并调整时间戳。

一旦我确定这是可行的,我计划使用一些动态sql自动设置日志表和触发器。

这是一种合理的方法吗?在日志表中没有任何主键的任何问题?

CREATE member (
    id INTEGER AUTO_INCREMENT,
    first_name VARCHAR(50) NOT NULL,
    last_name VARCHAR(50) NOT NULL,
    last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
);

-- Add change log table
CREATE TABLE change_log.member_log LIKE member;
ALTER TABLE change_log.member_log CHANGE id id INTEGER;
ALTER TABLE change_log.member_log CHANGE last_updated last_updated DATETIME;
ALTER TABLE change_log.member_log DROP PRIMARY KEY;
DELIMITER $$
    CREATE TRIGGER log_member_changes_on_update BEFORE UPDATE ON member FOR EACH ROW 
    BEGIN 
        INSERT INTO change_log.member_log SELECT * FROM member WHERE id = NEW.id; 
    END$$
DELIMITER ;

非常感谢

3 个答案:

答案 0 :(得分:0)

如果您希望经常按id选择,则可能需要在id列上添加索引。此外,如果您可以添加有关更改者的信息,则可能会有所帮助。也许你想考虑记录插入和删除?除此之外,我认为这是一个非常合理的方法。

答案 1 :(得分:0)

你应该考虑:

  1. 创建一个名为“Audit”的表格;
  2. 每次用户创建新记录或更新记录时,在该表中创建记录;
  3. 此表应具有:

    • 已更新的表的名称
    • 记录的编号,
    • 进行更改的用户的名称或ID
    • 采取的行动,如“更新地址”或“新客户创建”,
    • 更新时的timestamp
  4. 您必须在软件中的“Audit”表中插入数据,而不是从数据库中的任何触发器插入数据,否则您需要复制每个表的触发器。 编程你可以用一种方法来处理每个表一次。

答案 2 :(得分:0)

这基本上是个好主意。您可能希望为所有事件添加触发器,即插入,更新和删除。使用delete时,您必须手动将当前时间戳插入审计表,因为删除不会更新时间戳列。

考虑在审计表中存储旧值和新值(即非id列的数量加倍),因为当仅记录当前值时搜索值更改时很困难,但是当您同时记录这两个值时,很容易:

where old_column1 != new_column1

它还使得在特定时间找到价值变得容易:

where someDateTime between old_last_updated and new_last_updated

我已经成功地使用了这种方法。