如何在 mysql 触发器中 raise 之前提交事务?
How to commit transaction before raise in mysql trigger?
CREATE TRIGGER maindb.before_acc_update
BEFORE UPDATE
ON maindb.acc FOR EACH ROW
BEGIN
DECLARE errorMessage VARCHAR(255);
DECLARE clientName VARCHAR(100);
SET clientName = (select USER());
SET errorMessage = CONCAT('DB Error=> new acc_name value (',
NEW.acc_name,
') cannot be null or empty. Old Value is:',
OLD.acc_name);
IF new.acc_name is null or TRIM(COALESCE(new.acc_name , '')) = '' THEN
BEGIN
INSERT INTO maindb.acc_log_error (old_tz, new_tz, username) values (old.acc_name , new.acc_name, clientName);
END ;
SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = errorMessage;
END IF;
END;
Mysql 取消我的交易。我想登录 maindb.acc_log_error 并引发我的自定义错误。
抱歉,如果您在触发器中发出信号,它会中止该触发器的操作,包括该触发器所做的所有更改,例如你的 INSERT
进入日志 table.
在触发器中止后,您可以将插入保留到日志 table 的唯一方法是将 INSERT
作为单独的语句在 UPDATE
到 acc
产生了触发器。
CREATE TRIGGER maindb.before_acc_update
BEFORE UPDATE
ON maindb.acc FOR EACH ROW
BEGIN
DECLARE errorMessage VARCHAR(255);
DECLARE clientName VARCHAR(100);
SET clientName = (select USER());
SET errorMessage = CONCAT('DB Error=> new acc_name value (',
NEW.acc_name,
') cannot be null or empty. Old Value is:',
OLD.acc_name);
IF new.acc_name is null or TRIM(COALESCE(new.acc_name , '')) = '' THEN
BEGIN
INSERT INTO maindb.acc_log_error (old_tz, new_tz, username) values (old.acc_name , new.acc_name, clientName);
END ;
SIGNAL SQLSTATE '23000' SET MESSAGE_TEXT = errorMessage;
END IF;
END;
Mysql 取消我的交易。我想登录 maindb.acc_log_error 并引发我的自定义错误。
抱歉,如果您在触发器中发出信号,它会中止该触发器的操作,包括该触发器所做的所有更改,例如你的 INSERT
进入日志 table.
在触发器中止后,您可以将插入保留到日志 table 的唯一方法是将 INSERT
作为单独的语句在 UPDATE
到 acc
产生了触发器。