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

在两个不相关的表上使用mysql触发器,mysql,triggers,Mysql,Triggers,我需要创建一个用户活动日志,然后将其插入数据库。为此,我考虑使用mysql触发器,而不是在每个成功的查询中放置一个这样做的查询。 这两个表根本没有关系。 下面是一个例子: 餐桌水果 果名 风味 表_日志 用户id 表名 时间戳 表格用户 用户id 现在,每当我在表fruits上插入时,将值插入表_log的触发器也会执行。这里的问题是获取存储在另一个表中的用户id。如何确定要插入的用户id。据我所知,触发器不需要参数,所以我可能无法使用它从脚本中提供id。 有什么想法吗?我应该只使用存

我需要创建一个用户活动日志,然后将其插入数据库。为此,我考虑使用mysql触发器,而不是在每个成功的查询中放置一个这样做的查询。 这两个表根本没有关系。 下面是一个例子:

餐桌水果

  • 果名
  • 风味
表_日志

  • 用户id
  • 表名
  • 时间戳
表格用户

  • 用户id
现在,每当我在表fruits上插入时,将值插入表_log的触发器也会执行。这里的问题是获取存储在另一个表中的用户id。如何确定要插入的用户id。据我所知,触发器不需要参数,所以我可能无法使用它从脚本中提供id。
有什么想法吗?我应该只使用存储过程吗?

有三种方法:

  • 正如您所提到的,使用存储的proc插入到主表和日志表中

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

  • 让触发器自动计算出用户ID。这有两种口味:

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

  • 应用程序中的用户ID实际上以同名数据库用户的身份连接到数据库

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


当您插入水果表时,您还知道用户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')";