【问题标题】:Method to record what activities are performed on Database? -MySQL / PHP记录在数据库上执行了哪些活动的方法? -MySQL/PHP
【发布时间】:2012-03-07 18:32:02
【问题描述】:

我决定在我的数据库中创建一个新表,用于审核对我的数据库执行的所有操作。

我的表“活动”相当简单,包含以下列:

  • activity_id - 主键
  • user_id - 用户的外键
  • action - 正在执行的查询类型(SELECT、UPDATE、DELETE)
  • 表 - 受影响表的名称
  • 行 - 受影响行的名称

我现在正在做的是,当一个查询被执行时,我之后有另一个查询,它将信息插入到我的 "activity" 表中。

代码:

//query
$db->query("DELETE FROM foo WHERE id = '$foo->id'");
//activity record query
$db->query("INSERT INTO acitivity ( user_id, action, table, row ) VALUES ('$user->id', 'Deleted' , '$foo->id', 'foo')");

如您所见,我必须为每个查询手动执行此操作,并且我的系统中有 100 多个查询,我真的不想输入单个查询来记录发生的情况。

我想知道 MySQL 中是否有任何功能可以告诉我已经执行了哪些操作,或者 PHP 中是否有任何库或技术可以帮助我?

或者我注定要在我的系统中写出 100 个单独的查询?

谢谢

【问题讨论】:

  • 使用 mysql binlog 它记录几乎所有的变化。

标签: php mysql logging audit-logging


【解决方案1】:

如何创建触发器?

在 PHP 中进行审计并不是一个好主意。

【讨论】:

    【解决方案2】:

    为您的表创建 ON INSERT、ON_UPDATE 和 ON_DELETE 触发器,将所有更改的详细信息写入审计活动表

    【讨论】:

    • 如何将 user_id 分配给特定的审计。如果将 user_name/user_id 分配给记录,例如。用户 xyz 插入,abc 删除,xyz 更新。因为登录表可能包含用户详细信息。如何将这些当前用户详细信息发送到 ON INSERT、ON_UPDATE、ON_DELETE
    【解决方案3】:

    您如何为您的班级创建一个新方法,例如 $db->ql()(来自 query/log)首先进行正常查询,而不是采用 mysql_affected_rows() 并执行类似的操作

    insert into logs set when = now(), query_string = "{$query}", affected_rows = "{$affected_rows}"
    

    这样您就可以获得查询的完整历史记录,而不仅仅是查询的类型和运行它的表。

    【讨论】:

    • 你不应该将你的查询变量,尤其是那些内容像$query这样不可预测的变量内联到你的SQL中。如果可能,使用占位符;否则,使用正确的“引用”机制正确转义字符串。
    • @bart,你是对的。在将其插入 logs 表之前,您应该 mysql_real_escape_string() $query
    猜你喜欢
    • 2015-06-18
    • 1970-01-01
    • 2022-01-11
    • 2011-08-07
    • 1970-01-01
    • 2021-06-25
    • 1970-01-01
    • 2013-06-15
    • 1970-01-01
    相关资源
    最近更新 更多