MySQL:检查表的数据是否已修改没有触发器和UDF?

时间:2013-06-06 21:27:24

标签: php mysql sql

有没有办法知道MySQL表的数据是否已被修改?

2 个答案:

答案 0 :(得分:2)

您可以查询INFORMATION_SCHEMA数据库,表TABLES,并且有一列" UPDATE_TIME"。 (SHOW TABLES有点等同。)

另一种方法是让PHP访问db文件(如果可以找到它们)并检查文件修改的系统日期。 编辑读取权限足以进行此操作。

答案 1 :(得分:2)

在与@Voitcus聊天时,我们发现information_schema方法不适用于InnoDb表。对于此类表格,UPDATE_TIME列将为NULL

这就是为什么我们为InnoDB表制定了一个解决方案,它不需要对硬盘上的db文件进行读访问(我认为这是一个安全问题,没有管理员应该允许这个,也就是数据库服务器可能在不同的主持人身上)

解决方案:

如你所说,你不能使用触发器功能,你必须在PHP的应用程序级别修复它。 更新:请注意,对于当前版本的MySQL,使用触发器并不稳定,因为它们不会在级联外键操作上被调用。

首先创建一个表,让我们说stats

CREATE TABLE `yourdb`.`stats` (
    `id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
    `table_name` VARCHAR( 255 ) NOT NULL ,
    `last_update` DATETIME NOT NULL
) ENGINE = InnoDB;

为应用程序中的每个表插入一行。

在PHP中修改现有查询,以便它们使用事务并更新统计信息表。例如,可以使用mysqliPDO。我在这里使用PDO,例如我们删除了一行。

try {
    $pdo = new PDO($host, $user, $pass, $db, array((
        // this option is nice when working with transactions
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    ));
} catch (PDOException $e) {
    die('cannot connect to mysql');
}


try {
    // start transaction
    $pdo->beginTransaction();
    // delete a row
    $pdo->query('DELETE FROM `table1` WHERE `id` = 1');
    // update stats
    $pdo->query('UPDATE `stats` SET `last_update` = NOW() WHERE `table_name` = `table1`');
    // commit both queries at once
    $pdo->commit();
} catch (Exception $e) {
    // rollback both queries if one of them failed
    $pdo->rollback();
}

现在您可以使用以下查询来获取上次更新时间:

SELECT `last_updated` FROM `stats` WHERE `table_name` = 'table1'