non so come si faccia a rifiutare l'operazione, bisognerebbe capire il comportamento se si pongono solo alcune condizioni...
tipo questo:
codice:
DELIMITER //

CREATE TRIGGER tabprovaINcheck
BEFORE INSERT ON tabprova
FOR EACH ROW
BEGIN

IF
NEW.voto>0 AND NEW.voto<30
SET NEW.voto = "il valore che passi alla query (forse potrebbe essere anche un NEW.voto=New.voto)" 
END IF;

IF NEW.voto>18 AND NEW.stato='promosso' THEN
SET NEW.voto = "il valore che passi alla query (forse potrebbe essere anche un NEW.voto=New.voto)" 
SET NEW.stato = 'promosso'
END IF;

IF NEW.voto<18 AND NEW.stato='bocciato' THEN
SET NEW.voto = "il valore che passi alla query (forse potrebbe essere anche un NEW.voto=New.voto)" 
SET NEW.stato = 'bocciato'
END IF;

END; //
Fai un paio di prove