我想维护我的架构中几个表的更改的日志表。 我正在尝试设置它,以便我不需要列出我的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 ;
非常感谢
答案 0 :(得分:0)
如果您希望经常按id
选择,则可能需要在id
列上添加索引。此外,如果您可以添加有关更改者的信息,则可能会有所帮助。也许你想考虑记录插入和删除?除此之外,我认为这是一个非常合理的方法。
答案 1 :(得分:0)
你应该考虑:
此表应具有:
timestamp
您必须在软件中的“Audit”表中插入数据,而不是从数据库中的任何触发器插入数据,否则您需要复制每个表的触发器。 编程你可以用一种方法来处理每个表一次。
答案 2 :(得分:0)
这基本上是个好主意。您可能希望为所有事件添加触发器,即插入,更新和删除。使用delete时,您必须手动将当前时间戳插入审计表,因为删除不会更新时间戳列。
考虑在审计表中存储旧值和新值(即非id列的数量加倍),因为当仅记录当前值时搜索值更改时很困难,但是当您同时记录这两个值时,很容易:
where old_column1 != new_column1
它还使得在特定时间找到价值变得容易:
where someDateTime between old_last_updated and new_last_updated
我已经成功地使用了这种方法。