Lektionen des Moduls (3/4)
Einführung in Trigger
Ein Trigger ist eine magische Box (ein Sensor), die automatisch eine Logik ausführt, VOR oder NACH einem Einfüge-, Aktualisierungs- oder Löschereignis in den Daten.\nBevor wir einer Tabelle jedoch beibringen, zu reagieren, müssen wir ihr eine spezielle „Trigger-Funktion“ geben, die in PL/pgSQL geschrieben ist und am Ende ein synthetisches Format namens „TRIGGER“ zurückgeben muss.
Diese Funktionen akzeptieren keine normalen Argumente in Klammern; Stattdessen bieten sie die magischen integrierten Objekte NEW und OLD kostenlos an, die die ursprünglichen oder eingehenden Zeilendaten aus der Tabelle enthalten, die der Sensor überwacht!
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;Dieses Verfahren übernimmt die harte Arbeit des Schreibens in das Protokoll. Später wird es in einem zweiten Schritt dauerhaft mit den Ereignissen der Tabelle verbunden, die wir schützen möchten.
Probieren Sie es selbst aus
Wir müssen Kunden schützen: niemanden unter 18 Jahren (unser virtueller Check) oder, über die fiktive Logik hinaus, wir wollen erzwingen, dass die zum INSERT-Zeitpunkt übergebene Zeichenfolge „Vorname“ immer in Großbuchstaben in der Datenbank gespeichert wird und dabei jegliche JS-Client-Formatierung ignoriert. Schreiben Sie eine Triggerfunktion namens „force_uppercase_name()“. Es akzeptiert keine ()-Argumente. Es gibt TRIGGER zurück. Erstellen Sie die Textvorlage. Erzwingen Sie die Zuweisung des gesamten eingehenden Objekts über die magische Zuweisung „NEW.first_name = UPPER(NEW.first_name);“. Geben Sie dann die umgeformte Variable NEW zurück.
Hinweis anzeigen
FUNKTION ERSTELLEN ODER ERSETZEN force_uppercase_name() RETURNS TRIGGER AS $$ BEGIN NEW.first_name = UPPER(NEW.first_name); RÜCKGABE NEU; ENDE; $$ SPRACHE plpgsql;
Lösung nach 3 Versuchen verfügbar
Erstellen Sie eine Triggerfunktion „protect_price_drops()“, die bösartige Updates blockiert, bei denen ein Angreifer im Begriff ist, einen lächerlich niedrigen Preis für ein Produkt zu sparen. Verwenden Sie eine Logik wie „IF NEW.unit_price < OLD.unit_price THEN“, um eine native Ausnahme auszulösen, die alles zum Absturz bringt. Eine schwerwiegende PL/pgSQL-Ausnahme verwendet die Form „RAISE EXCEPTION „Prezzo non abbassabile!“;“.
Hinweis anzeigen
BEGIN IF NEW.unit_price < OLD.unit_price THEN RAISE EXCEPTION 'Prezzo non abbassabile!'; ENDE WENN; RÜCKGABE NEU; ENDE;
Lösung nach 3 Versuchen verfügbar