sobota, 7 maja 2011

Triggery w PostgreSQL

Trigger definiuje się następującą składnią:
CREATE TRIGGER nazwa -- każdy trigger musi się jakoś nazywać
BEFORE albo AFTER -- czy trigger ma być wykonany przed czy po wydarzeniu
INSERT albo UPDATE albo DELETE -- których wydarzen trigger dotyczy, można połączyć kilka przez OR)
ON tabela -- trigger zawsze zakłada się na konkretną tabelę
FOR EACH
ROW albo STATEMENT -- czy trigger ma być wywołany raz na rekord, czy raz na instrukcję
EXECUTE PROCEDURE procedura(parametry);-- co ma być wywołane jako obsługa triggera

Trigger usuwa się następującą składnią:
DROP TRIGGER nazwa ON tabela -- usunięce konkretnego triggera z konkretnj tabeli

Tak więc, aby wywołać funkcję skasowano() po każdym skasowaniu rekordu z bazy rejestr należy wydać następujące polecenie:
CREATE TRIGGER mojtrigger AFTER DELETE ON rejestr FOR EACH ROW EXECUTE PROCEDURE skasowano();

Efekty uboczne w fazie BEFORE


Triggery w fazie BEFORE mogą mieć dwa różne efekty uboczne:
  • W przypadku wszystkich wydarzeń - jeżeli procedura triggera zwróci wartość NULL, to dana czynność ma zostać anulowana i dalsze triggery związane z tą czynnością nie zostaną wywołane. Często mówi się, że taki trigger wetuje jakąś operację.
  • W przypadku wydarzeń UPDATE i INSERT procedura triggera może zwrócić nową zawartość rekordu i wtedy ta właśnie wartość (a nie ta wynikająca z parametrów instrukcji UPDATE lub INSERT INTO) znajdzie się w bazie.

Macierz triggerów


wydarzenie/faza BEFORE AFTER
INSERT
  • Możliwe jest zawetowanie wstawienia.
  • Wstawiane wartości dostępne są w tablicy NEW.
  • Modyfikacja zawartości tablicy NEW powoduje wstawienie zmodyfikowanych danych.
  • W przypadku braku weta funkcja powinna zwrócić NEW.


  • Dane są już fizycznie wstawione do tabeli.
  • Wstawione dane znajdują się w tablicy NEW.

UPDATE
  • Możliwe jest zawetowanie uaktualnienia.
  • Aktualne wartości dostępne są w tablicy OLD a nowe w tablicy NEW.
  • Modyfikacja zawartości tablicy NEW powoduje wstawienie zmodyfikowanych danych.
  • W przypadku braku weta funkcja powinna zwrócić NEW.


  • Dane są już fizycznie zmodyfikowane w tabeli.
  • Poprzednie wartości dostępne są w tablicy OLD a aktualne w tablicy NEW.

DELETE
  • Możliwe jest jedynie zawetowanie usunięcia.
  • Nie ma możliwości uaktualnienia zamiast skasowania.
  • Pola kasowanego rekordu dostępne są w tablicy OLD


  • Rekord jest już fizycznie skasowany
  • Pola skasowanego rekordu dostępne są w tablicy OLD