2015-05-13 28 views
0

我试图在使用MySQL的触发器中编写业务规则,但它不起作用。如何在mysql中触发器上编写业务规则

我想要做的是,如果条件为false,则插入必须失败并回滚它。问题是MySQL不允许在触发器中使用回滚。

我也试过使用信号和文本消息,但它失败。

的代码是:如果失败

CREATE TRIGGER tr_NewTeacher 
AFTER INSERT ON teachers FOR EACH ROW 
BEGIN 
    IF (salary > 1300 AND budget < 15000) 
    BEGIN 
     ROLLBACK TRANSACTION; 
    END    
END 
+0

为什么在插入之后,为什么不在之前?无需回滚然后 – Hawk

回答

0

在MySQL触发器将回滚事务。

所以,你必须触发体内引发异常:

... 
if [Test] 
    then 

     SIGNAL sqlstate '45001' set message_text = "No way ! You cannot do this !"; 

    end if ; 
... 
0

您应该使用before insert和获取列的值,你需要使用new

所以触发器将作为

delimiter // 
create trigger tr_NewTeacher before insert on teacher 
for each row 
begin 
    if new.salaRY>1300 AND new.budget<15000 then 
    signal sqlstate '45000' set message_text = 'Your error message'; 
end if; 
end;// 

delimiter ; 

这里是一个在mysql中的测试用例

mysql> create table teacher (id int auto_increment primary key,salaRY int , budget int); 
Query OK, 0 rows affected (0.17 sec) 

mysql> delimiter // 
mysql> create trigger tr_NewTeacher before insert on teacher 
    -> for each row 
    -> begin 
    -> if new.salaRY>1300 AND new.budget<15000 then 
    -> signal sqlstate '45000' set message_text = 'Your error message'; 
    -> end if; 
    -> end;// 
Query OK, 0 rows affected (0.14 sec) 


mysql> insert into teacher (salaRY,budget) values (1200,16000); 
Query OK, 1 row affected (0.04 sec) 

mysql> insert into teacher (salaRY,budget) values (1400,13000); 
ERROR 1644 (45000): Your error message 
mysql> select * from teacher ; 
+----+--------+--------+ 
| id | salaRY | budget | 
+----+--------+--------+ 
| 1 | 1200 | 16000 | 
+----+--------+--------+ 
1 row in set (0.00 sec) 
+0

非常感谢。我确信它可能是一个插入后。 – onecracky

+0

在插入而不是回滚之前不需要做更好的事情。 –