在两个不相关的表上使用mysql触发器
我需要创建一个用户活动日志,然后将其插入数据库。为此,我考虑使用mysql触发器,而不是在每个成功的查询中放置一个这样做的查询。 这两个表根本没有关系。 下面是一个例子: 餐桌水果在两个不相关的表上使用mysql触发器,mysql,triggers,Mysql,Triggers,我需要创建一个用户活动日志,然后将其插入数据库。为此,我考虑使用mysql触发器,而不是在每个成功的查询中放置一个这样做的查询。 这两个表根本没有关系。 下面是一个例子: 餐桌水果 果名 风味 表_日志 用户id 表名 时间戳 表格用户 用户id 现在,每当我在表fruits上插入时,将值插入表_log的触发器也会执行。这里的问题是获取存储在另一个表中的用户id。如何确定要插入的用户id。据我所知,触发器不需要参数,所以我可能无法使用它从脚本中提供id。 有什么想法吗?我应该只使用存
- 果名
- 风味
- 用户id
- 表名
- 时间戳
- 用户id
有什么想法吗?我应该只使用存储过程吗?有三种方法:
- 正如您所提到的,使用存储的proc插入到主表和日志表中
- 将用户ID(由应用程序提供)作为主(水果)表中的一列存储为“inserted_by”列;然后让触发器填充日志表并从主表读取用户
- 让触发器自动计算出用户ID。这有两种口味:
- 用户ID存在于应用程序端,但不存在于数据库端(例如,用户登录到网页,但CGI后端代码始终作为特殊的“http”数据库用户连接到数据库)
- 应用程序中的用户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')";