Да, можете, но как ще го направите зависи от вашата версия.
На първо място, тригерите сами по себе си са транзакционни; във вашата ситуация имате тригер за вмъкване, който изпълнява още две вмъквания. Ако едно от тях се провали, ще получите желания ефект.
Помислете за следния пример:
CREATE TABLE a (colA INT);
CREATE TABLE b (colB INT);
CREATE TABLE c (colC INT);
delimiter :
CREATE TRIGGER testtrig BEFORE INSERT ON a
FOR EACH ROW BEGIN
INSERT INTO b(colB) VALUES(NEW.colA);
INSERT INTO c(banana) VALUES (NEW.colA); -- note the faulty column name
END;:
delimiter ;
Сега, когато стартирам вмъкване, което не успее, това се случва:
mysql> INSERT INTO a VALUES (5);
ERROR 1054 (42S22): Unknown column 'banana' in 'field list'
mysql> SELECT * FROM a;
Empty set (0.00 sec)
Това съответства на желания от вас резултат.
По-общо казано, ако имате логика, която можете да използвате, за да потвърдите данните си, преди да опитате вмъкването, можете да провалите задействането по различни начини:
- В MySQL 5.5 можете да използвате SIGNAL механизъм за издигане на грешка от спусъка ви, като по този начин причинява неуспех на цялото вмъкване.
- Преди MySQL 5.5 можете да генерирате умишлена грешка, за да провалите задействането.
Предполагам, че използвате 5.0 от връзката във вашия въпрос, така че ако трябва, можете да извършите умишлена грешка, например умишлено вмъкване в невалидна колона, за да не успеете да задействате. Въпреки това ситуацията, която описвате във вашия въпрос, вече се обработва транзакционно, както е описано в началото на моя отговор.