在2个不相关的表上使用mysql触发器

时间:2011-10-02 06:30:18

标签: mysql triggers

我需要创建一个用户活动日志,然后将其插入到数据库中。为此,我正在考虑使用mysql触发器,而不是放置一个查询,在每个成功的查询上执行此操作。 这两张桌子完全没有关系。 这是一个例子:

table_fruits

  • 水果名称
  • 味道

table_log

  • 用户ID
  • 表格名称
  • 时间戳

table_users

  • 用户ID

现在每次我在表水果上插入时,也会执行将值插入table_log的触发器。我的问题是获取存储在另一个表中的用户ID。如何确定要插入的用户ID。据我所知,触发器不需要参数,所以我不能用它来从我的脚本提供id。 有任何想法吗?我应该只使用存储过程吗?

2 个答案:

答案 0 :(得分:1)

有三种方法:

  • 如您所述,使用存储过程插入主表和日志表

  • 将用户ID(由应用提供)存储为主(水果)表中的一列,作为" inserted_by"柱;然后让触发器填充日志表并从主表中读取用户

  • 让触发器自动找出用户ID。这有两种风格:

    1. 用户ID存在于应用程序端,但不存在于数据库端(例如,用户登录到网页,但CGI后端代码始终作为特殊数据库连接到数据库" http"数据库用户)。

    2. 来自应用程序的用户ID实际上连接到DB作为具有相同名称的数据库用户。

      在这种情况下,您应该使用 USER() (但是 current_user()而是返回创建触发器的人,或者更准确地说, ID用于触发权限检查)

答案 1 :(得分:1)

当你插入水果表时,你也知道user_id值。

我建议像这样创建一个黑洞表:

CREATE TABLE bh_fruit (
  user_id integer not null,
  fruit_name varchar(255), 
  flavor varchar(255)
) ENGINE = BLACKHOLE;

在黑洞桌上放一个扳机。

DELIMITER $$

CREATE TRIGGER ai_bh_fruit_each AFTER INSERT ON bh_fruit FOR EACH ROW
BEGIN
  INSERT INTO fruit (fruit_name, flavor) VALUES (NEW.fruit_name, NEW.flavor);
  INSERT INTO log (user_id, tablename) VALUES (NEW.user_id, 'fruit');
END $$

DELIMITER ;

现在您的PHP代码变为:

$user_id = mysql_real_escape_string($user_id);
$fruit = mysql_real_escape_string($fruit);
$flavor = mysql_real_escape_string($flavor);
$sql = "INSERT INTO bh_fruit (user_id, fruit_name, flavor) 
          VALUES ('$user_id','$fruit','$flavor')";