Das folgende Beispiel basiert auf einer Fehlerbehebungsmethode mit Triggern in Triggern aus Kapitel 11, Seiten 254-256 des Buches MySQL Stored Procedure Programming unter der Überschrift 'Validieren von Daten mit Triggern' :
DELIMITER $$
CREATE TRIGGER reservation_bi BEFORE INSERT ON reservation FOR EACH ROW
BEGIN
DECLARE found_count,dummy INT;
SELECT COUNT(1) INTO found_count FROM flights WHERE numflight=new.numflight;
IF found_count = 0 THEN
SELECT 'Cannot Insert This Reservation Because Flight Number is Invalid'
INTO dummy FROM reservation WHERE numflight=new.numflight;
END IF;
END; $$
DELIMITER ;
Wenn eine andere Validierung durchgeführt werden muss, befolgen Sie dieselbe Fehlerbehebungsmethode !!!
AKTUALISIEREN
Der Grund, warum das Buch vorschlägt, den Trigger auf diese Weise zu verhindern, liegt in der Tatsache begründet, dass in der MySQL Stored Procedure Language SIGNAL nicht in der Sprache implementiert war (SIGNAL ist natürlich ANSI-Standard).
Die Autoren des Buches haben Workarounds erstellt, indem sie SQL-Anweisungen aufgerufen haben, die syntaktisch korrekt sind, aber zur Laufzeit fehlschlagen. Die Seiten 144-145 (Kapitel 6: Fehlerbehandlung) des Buches enthalten diese Beispiele zum direkten Verhindern einer gespeicherten Prozedur (Beispiel 6-18) oder durch SIGNAL-Emulation (Beispiele 6-19 und 6-20).
# Example 6-18. Using a nonexistent column name to force an error to the calling program
CREATE PROCEDURE sp_update_employee_dob2
(p_employee_id INT, p_dob DATE)
BEGIN
IF datediff(curdate(),p_dob)<(16*365) THEN
UPDATE `Error: employee is too young; Employee must be 16 years or older`
SET x=1;
ELSE
UPDATE employees
SET date_of_birth=dob
WHERE employee_id=p_dob;
END IF;
END;
# Example 6-19. Standard procedure to emulate SIGNAL
CREATE PROCEDURE `my_signal`(in_errortext VARCHAR(255))
BEGIN
SET @sql=CONCAT('UPDATE `',in_errortext,'` SET x=1');
PREPARE my_signal_stmt FROM @sql;
EXECUTE my_signal_stmt;
DEALLOCATE PREPARE my_signal_stmt;
END;
# Example 6-20. Using our SIGNAL emulation procedure to raise an error
CREATE PROCEDURE sp_update_employee_dob2
(p_employee_id INT, p_dob DATE)
BEGIN
IF datediff(curdate(),p_dob)<(16*365) THEN
CALL my_signal('Error: employee is too young; Employee must be 16 years or older')
ELSE
UPDATE employees
SET date_of_birth=dob
WHERE employee_id=p_dob;
END IF;
END;
Leider kann die SIGNAL-Emulation aus den Beispielen 6-19 und 6-20 nicht in Triggern durchgeführt werden. Die Autoren des Buches verwendeten die Technik in Beispiel 6-18, um Auslöser auf den Seiten 254-256 zu verhindern. Deshalb muss der Vorschlag des Buches der richtige Weg sein.