MySQL 触发器:在删除之前在日志中插入 table
MySQL Triggers: INSERT ON log BEFORE DELETE ON table
这是我第一次 post 来这里! =]
我正在创建一个触发器以在每次有人试图从 table
中删除某些内容时插入日志 table
CREATE DEFINER=`root`@`localhost` TRIGGER `user_before_delete`
BEFORE DELETE ON `user` FOR EACH ROW BEGIN
INSERT INTO log_alert(id, table_id, name)
VALUES('99002', OLD.id, OLD.name);
SIGNAL SQLSTATE '99002'
SET MESSAGE_TEXT = 'TRYING TO REMOVE A USER!'
END
但问题是:
SIGNAL SQLSTATE 回滚整个操作!
那么,如何在日志 TABLE 上插入并防止删除用户?
在使用 BEGIN/END
块之前,将分隔符更改为 $$
,然后切换回:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` TRIGGER `user_before_delete`
BEFORE DELETE ON `user` FOR EACH ROW BEGIN
INSERT INTO log_alert(id, table_id, name)
VALUES('99002', OLD.id, OLD.name);
SIGNAL SQLSTATE '99002'
SET MESSAGE_TEXT = 'TRYING TO REMOVE A USER!';
END $$
DELIMITER ;
试试吧!!!
Marc B 解决方法对我有用 =]
quick/dirty workaround: change log_alert to be a myisam table. no transactions there, so no way to roll back your insert. – Marc B 15 hours ago
只需将 log_alert 更改为 MyISAM 类型,INSERTS 将不再回滚
这是我第一次 post 来这里! =]
我正在创建一个触发器以在每次有人试图从 table
中删除某些内容时插入日志 tableCREATE DEFINER=`root`@`localhost` TRIGGER `user_before_delete`
BEFORE DELETE ON `user` FOR EACH ROW BEGIN
INSERT INTO log_alert(id, table_id, name)
VALUES('99002', OLD.id, OLD.name);
SIGNAL SQLSTATE '99002'
SET MESSAGE_TEXT = 'TRYING TO REMOVE A USER!'
END
但问题是: SIGNAL SQLSTATE 回滚整个操作! 那么,如何在日志 TABLE 上插入并防止删除用户?
在使用 BEGIN/END
块之前,将分隔符更改为 $$
,然后切换回:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` TRIGGER `user_before_delete`
BEFORE DELETE ON `user` FOR EACH ROW BEGIN
INSERT INTO log_alert(id, table_id, name)
VALUES('99002', OLD.id, OLD.name);
SIGNAL SQLSTATE '99002'
SET MESSAGE_TEXT = 'TRYING TO REMOVE A USER!';
END $$
DELIMITER ;
试试吧!!!
Marc B 解决方法对我有用 =]
quick/dirty workaround: change log_alert to be a myisam table. no transactions there, so no way to roll back your insert. – Marc B 15 hours ago
只需将 log_alert 更改为 MyISAM 类型,INSERTS 将不再回滚