2011-10-02 32 views
0

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

table_fruits

  • 水果名称
  • 味道

table_log

  • 用户ID
  • 0表
  • 时间戳

table_users

  • 用户ID

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

回答

1

有3种方法是:

  • 正如你提到的,使用存储过程插入到两个主表和日志表

  • 存储用户ID(由所提供app)作为主(fruit)表中的列作为“inserted_by”列;然后让触发器填充日志表并从主表读取用户。

  • 让触发器自动找出用户标识。这有两种形式:

    1. 用户ID上的应用程序并存,但不是在数据库端(例如,一个用户登录到一个网页,但CGI后端代码始终连接到一个数据库作为特殊的“HTTP”数据库用户)。

    2. 应用程序的用户标识实际上以相同名称的数据库用户连接到数据库。

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

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')"; 
相关问题