Direkt zum Hauptinhalt springen
eLearner.app
Modul 12 · Lektion 3 von 447/57 im Kurs~15 min
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!

SQL
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

Übung#sql.m12.l3.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#sql.m12.l3.e2
Versuche: 0Wird geladen…

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!“;“.

Editor wird geladen…
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