MySQL触发器删除传递用户ID

时间:2013-02-01 10:19:57

标签: mysql triggers pdo

我需要创建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值传递给触发器?有什么想法,建议吗?

1 个答案:

答案 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;