我的想法是创建一个名为“changelog_table”的表,其中包含以下列:
updated_table //the table being updated
updated_column //the column being updated
updated_row //the id of the row being updated
updated_content //this is what they updated the field to
updated_user //the user who updated
updated_datetime //the timestamp it was updated
我认为这是我真正想要的最低和最高,但我可能错了。 另外......经过几周的阅读后,我不明白如何在我的触发器中存储变量(如“哪个表正在更新”和“哪个列正在更新”等等)。
所以,假设我有一个名为“foo_table”的表,其中一列“bar_column”,行“58008”,用户“peter_griffin”更新为“这是新内容”,12 / 30/2013中午。
什么触发器可以捕获那个样子?
答案 0 :(得分:2)
您需要在UPDATE
的每个表格上创建单独的触发器(如果需要,还需要INSERT
和DELETE
)。他们每个人都可以调用与实际记录相同的存储过程。
触发器可以向存储过程传递一个参数,该参数包含正在执行操作的表的名称(因为触发器是特定于表的,它将知道这一点 - 它必须是硬编码的);要检测哪些列已更新,您需要在每个触发器中为相应表格中的每列NEW.column
与OLD.column
进行比较。
例如:
CREATE TRIGGER upd_tbl_name AFTER UPDATE ON tbl_name FOR EACH ROW
CALL AuditLog('UPDATE', 'tbl_name', NEW.id, CONCAT_WS(',',
IF(NEW.columnA <=> OLD.columnA, NULL, CONCAT('columnA:=', NEW.columnA)),
IF(NEW.columnB <=> OLD.columnB, NULL, CONCAT('columnB:=', NEW.columnB)),
-- etc.
));
CREATE PROCEDURE AuditLog(
Action VARCHAR(10),
TableName VARCHAR(64),
RowID INT,
Columns TEXT,
)
INSERT INTO changelog_table VALUES (
Action,
TableName,
RowID,
Columns
USER(),
NOW(),
);