2015-05-13 29 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

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