mysql,如何创建表并自动跟踪添加或删除行/表的用户

时间:2011-02-11 16:49:51

标签: mysql perl

我想为我的sql数据库提供某种修订控制历史记录。

我希望这个表能够在更新时记录谁,删除了什么等等。

我使用Perl连接到MySQL。

2 个答案:

答案 0 :(得分:7)

方法1:创建单独的“审核”表并使用triggers填充信息。

以下是MySQL(和Postrges)的简要指南:http://www.go4expert.com/forums/showthread.php?t=7252

方法2:从Perl数据库访问代码中填充审核信息。理想情况下,作为同一交易的一部分。第一种方法并没有明显的胜利和许多缺点(你没有抓住你的代码外面的变化,一个)

答案 1 :(得分:1)

**免责声明:我过去遇到过这种情况,但是在PHP中。概念适用于PHP,但可以通过一些思考应用于perl。

我想到了为每个表AFTER INSERTAFTER UPDATEAFTER DELETE添加触发器的想法 完成同样的事情。这个问题是:

  • 触发器不知道'admin'用户,只知道db用户(CURRENT_USER
  • 最大的问题是将这些触发器添加到我的所有表中是不可行的(我想我可以编写一个脚本来添加触发器)。
  • 触发器的可维护性。如果您更改了跟踪内容的方式,则必须更新所有触发器。我想有一个触发器调用存储过程将主要解决这个问题。

无论哪种方式,对于我的情况,我发现最佳的行动方案是在应用层(而不是DB层):

  • 创建一个DB抽象层,如果你还没有(处理与数据库的所有交互的类)。
  • 为每个操作创建功能(插入,更新,删除)。
  • 在每个功能中,成功进行查询调用后,添加另一个将相关信息插入跟踪表的查询

如果操作正确,将跟踪您为更新任何表而执行的任何操作。我不得不为特定表添加一些覆盖以不跟踪(例如,在'track_table'表上跟踪插入的重点是什么)。这是一个示例表跟踪模式:

CREATE TABLE `track_table` (
  `id` int(16) unsigned NOT NULL,
  `userID` smallint(16) unsigned NOT NULL,
  `tableName` varchar(255) NOT NULL DEFAULT '',
  `tupleID` int(16) unsigned NOT NULL,
  `date_insert` datetime NOT NULL,
  `action` char(12) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `userID` (`userID`),
  KEY `tableID` (`tableName`,`tupleID`,`date_insert`)
) ENGINE=InnoDB