4

我需要创建 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 永远不会为空,因为它是主键。现在我必须创建一个删除触发器来将用户 ID 记录到审计表中,但是我想在这种情况下触发器将在删除查询本身之前触发,这意味着不会创建 @userID 变量?这是我将其作为值传递给触发器的想法。

我觉得我已经接近解决方案了,但这个问题是一个障碍。如何在语句中没有多个查询的情况下将用户 ID 值传递给触发器?有什么想法、建议吗?

4

1 回答 1

-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;
于 2013-02-01T10:35:23.717 回答