In MySQL auslösen, um das Einfügen zu verhindern

7

Ich möchte den Trigger erstellen, der das Einfügen in die Reservierungstabelle von Flügen ( numflights) verhindert, die nicht vorhanden sind.

Tables
----------------------------------------------
flights(numflight, origine, destination, dep, arr)
airports(code, city, country)
reservation(people, numflight, date_travel)

Die Spalten origineund destinationenthalten Flughafencodes.

GameBuilder
quelle
Sie können diesen Link für Ihre Anfrage verwenden. roseindia.net/sql/trigger/mysql-trigger-after-update.shtml Geben Sie hier die Linkbeschreibung ein. Danke.
Chandresh
Um das Einfügen in die Reservierungstabelle zu verhindern, ist ein "BEFORE INSERT" -Trigger und nicht "AFTER UPDATE" erforderlich, da der Trigger vorbelegt werden muss, falls der Numflight-Wert, den Sie in die Reservierungstabelle einfügen möchten, NICHT gilt EXIST in der Flugtabelle. Aus diesem Grund habe ich das Beispiel aus dem Buch 'MySQL Stored Procedures Programming' verwendet.
RolandoMySQLDBA
Dies sollte trivial sein. Fügen Sie einen Fremdschlüssel hinzu.
Ypercubeᵀᴹ

Antworten:

4

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.

RolandoMySQLDBA
quelle
2

Warum nicht einfach INSERT-Rechte entfernen?

gbn
quelle