我需要创建MySQL触发器,它将在删除表行语句上记录用户ID,这必须适合一个查询,因为我正在使用PHP PDO。这是我到目前为止所得到的:
我需要在删除查询中传递用户ID的方法,即使它与要执行的删除操作无关:
通常查询看起来像这样:
DELETE FROM mytable WHERE mytable.RowID = :rowID
如果我可以在我的陈述中使用多个查询,我会这样做:
SET @userID := :userID;
DELETE FROM mytable WHERE mytable.RowID = :rowID;
这样变量@userID将在触发事件触发之前设置,并且可以使用它。但是因为我需要在一个查询中挤压我的删除语句,所以我提出了这个:
DELETE FROM mytable
WHERE CASE
WHEN @userID := :userID
THEN mytable.RowID = :rowID
ELSE mytable.RowID IS NULL
END
注意:RowID永远不会为null,因为它是主键。现在我必须创建一个删除触发器来将用户ID记录到审计表中,但是我想在这种情况下触发器将在删除查询本身之前触发,这意味着不会创建@userID变量?这是我将它作为值传递给触发器的想法。
我觉得我接近解决方案,但这个问题是一个阻碍者。如何在语句中没有多个查询的情况下将用户ID值传递给触发器?有什么想法,建议吗?
答案 0 :(得分:-1)
您可以使用NEW / OLD mysql触发器扩展。参考:http://dev.mysql.com/doc/refman/5.0/en/trigger-syntax.html
以下是示例代码:
drop table `project`;
drop table `projectDEL`;
CREATE TABLE `project` (
`proj_id` int(11) NOT NULL AUTO_INCREMENT,
`proj_name` varchar(30) NOT NULL,
`Proj_Type` varchar(30) NOT NULL,
PRIMARY KEY (`proj_id`)
);
CREATE TABLE `projectDEL` (
`proj_id` int(11) NOT NULL AUTO_INCREMENT,
`proj_name` varchar(30) NOT NULL,
`Proj_Type` varchar(30) NOT NULL,
PRIMARY KEY (`proj_id`)
);
INSERT INTO `project` (`proj_id`, `proj_name`, `Proj_Type`) VALUES
(1, 'admin1', 'admin1'),
(2, 'admin2', 'admin2');
delimiter $
CREATE TRIGGER `uProjectDelete` BEFORE DELETE ON project
FOR EACH ROW BEGIN
INSERT INTO projectDEL SELECT * FROM project WHERE proj_id = OLD.proj_id;
END;$
delimiter ;
DELETE FROM project WHERE proj_id = 1;
SELECT * FROM project;
SELECT * FROM projectDEL;