Przejdź do głównej treści
eLearner.app
Moduł 12 · Lekcja 3 z 447/57 w kursie~15 min
Lekcje modułu (3/4)

Wprowadzenie do wyzwalaczy (triggers)

Wyzwalacz to magiczne pudełko (czujnik), które automatycznie uruchamia element logiki PRZED lub PO wstawieniu, aktualizacji lub usunięciu zdarzenia w danych.\nJednak przed nauczeniem tabeli reagowania musimy nadać jej specjalną „Funkcję wyzwalacza” napisaną w PL/pgSQL, która musi zakończyć się zwróceniem syntetycznego formatu zwanego „TRIGGER”.

Funkcje te nie akceptują normalnych argumentów w nawiasach; zamiast tego oferują za darmo magiczne wbudowane obiekty NEW i OLD, które zawierają oryginalne lub przychodzące dane wierszy z tabeli obserwowanej przez czujnik!

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;

Ta procedura polega na wykonywaniu ciężkiej pracy związanej z zapisywaniem w dzienniku. Później, w drugim kroku, zostanie on na stałe podłączony do wydarzeń ze stołu, który chcemy chronić.

Spróbuj sam

Ćwiczenie#sql.m12.l3.e1
Próby: 0Ładowanie...

Musimy chronić klientów: nikt nie ma mniej niż 18 lat (nasza wirtualna kontrola) lub poza fikcyjną logiką chcemy wymusić, aby ciąg „imię” przekazywany podczas INSERT był zawsze zapisywany w bazie danych wielkimi literami, ignorując formatowanie klienta JS. Napisz funkcję wyzwalającą o nazwie „force_uppercase_name()”. Nie przyjmuje żadnych () argumentów. Zwraca TRIGGER. Utwórz szablon treści. Wymuś przypisanie całego przychodzącego obiektu poprzez magiczne przypisanie 'NEW.first_name = UPPER(NEW.first_name);'. Następnie ZWRÓĆ przekształconą nową zmienną.

Ładowanie edytora...
Pokaż wskazówkę

UTWÓRZ LUB ZAMIEŃ FUNKCJĘ force_uppercase_name() ZWRACA WYZWALACZ JAKO $$ BEGIN NEW.first_name = UPPER(NEW.first_name); ZWROT NOWY; KONIEC; $$ JĘZYK plpgsql;

Rozwiązanie dostępne po 3 próbach

Ćwiczenie#sql.m12.l3.e2
Próby: 0Ładowanie...

Utwórz funkcję wyzwalającą „protect_price_drops()”, która blokuje złośliwe aktualizacje, w przypadku których osoba atakująca ma zamiar zaoszczędzić absurdalnie niską cenę na produkcie. Użyj logiki takiej jak „JEŚLI NOWA.cena_jednostkowa < STARA.cena_jednostkowa WTEDY”, wywołując natywny wyjątek, który powoduje awarię wszystkiego. Katalogowy wyjątek PL/pgSQL używa formy „WYJDŹ WYJĄTEK „Prezzo non abbassabile!”;”.

Ładowanie edytora...
Pokaż wskazówkę

ROZPOCZNIJ JEŚLI NOWA.cena_jednostkowa < STARA.cena_jednostkowa NASTĘPNIE PODNIEŚ WYJĄTEK „Prezzo non abbassabile!”; KONIEC JEŚLI; ZWROT NOWY; KONIEC;

Rozwiązanie dostępne po 3 próbach