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!
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
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ą.
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
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!”;”.
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