Plan zajęć
- Wyzwalacze w bazie PostgreSQL
Wyzwalacze są procedurami wykonywanymi automatycznie przy zajściu określonego zdarzenia, np. wstawieniu nowego rekordu do określonej tabeli. Pierwotnie wyzwalacze nie miały służyć do zapewnienia legalności stanów bazy (w ramach SQL do realizacji tego zagadnienia opracowano warunki integralności i asercje) lecz do zapewnienia legalności przejść między stanami. Jednak większość DBMS nie implementuje asercji a wyzwalacze używamy również do realizacji złożonych ograniczeń, których nie można wyrazić w poleceniach takich jak CREATE TABLE.
W strukturze wyzwalacza wyróżniami trzy elementy:
- Zdarzenie (Event): np. modyfikacja tabeli,
- Warunek (Condition) : wyrażenie Booleowskie w SQL,
- Akcje (Action): polecenia do wykonania, najczęsciej zapisywane w SQL lub PL/SQL.
Składnia wyzwalacza napisanego w SQL (mniej więcej zgodna ze standardem SQL ISO) przedstawiona została poniżej.
CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
ON table_name
[ FROM referenced_table_name ]
[ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
[ FOR [ EACH ] { ROW | STATEMENT } ]
[ WHEN ( condition ) ]
EXECUTE PROCEDURE function_name ( arguments )
where event can be one of:
INSERT
UPDATE [ OF column_name [, ... ] ]
DELETE
TRUNCATE
W ramach wyzwalacza określamy, czy ich akcje mają być wykonane przed czy po właściwej operacji (BEFORE lub AFTER). Ponadto dla wyzwalacza określony jest jeden z dwóch poziomów: wiersza lub zadanie. Wyzwalacz poziomu zadania jest realizowany tylko raz dla całego polecenia SQL, natomiast wyzwalacz poziomu wiersza jest realizowany niezależnie dla każdego modyfikowanego wiersza.
W tabeli poniżej zaprezentowano możliwości wykorzystania wyzwalaczy dla różnych zdarzeń.
| When | Event | Row-level | Statement-level |
|---|---|---|---|
| BEFORE | INSERT/UPDATE/DELETE | Tables and foreign tables | Tables, views, and foreign tables |
| TRUNCATE | — | Tables | |
| AFTER | INSERT/UPDATE/DELETE | Tables and foreign tables | Tables, views, and foreign tables |
| TRUNCATE | — | Tables | |
| INSTEAD OF | INSERT/UPDATE/DELETE | Views | — |
| TRUNCATE | — | — |
Funkcja występująca w wyzwalaczu w Postgresie definiowana jest w PL/pgSQL. Jest to bezargumentowa funkcja zwracająca specjalny typ TRIGGER. Funkcja połączona z wyzwalaczem otrzymuje dane za pośrednictwem struktury TriggerData, a nie przez zwykłe parametry funkcyjne, dlatego procedur tych nie należy wywoływać bezpośrednio. Sa one wywoływane niejawnie przez wyzwalacz, ilekroć wystąpi zdarzenie z nim związane.
Poniżej przykładowa konstrukcja funkcji realizowanej przez wyzwalacz.
CREATE FUNCTION name () RETURNS TRIGGER AS $$ ... ciało funkcji ... $$ LANGUAGE 'plpgsql';
W ramach funkcji dostępne są specjalne zmienne.
- OLD – zmienna typu RECORD reprezentuje wiersz przed modyfikacją dla poleceń UPDATE i DELETE. Posiada wartość NULL w przypadku poleceń INSERT, TRUNCATE, znacznika FOR EACH STATEMENT oraz operacji wykonywanych w języku SQL.
- NEW – zmienna typu RECORD reprezentuje wiersz po modyfikacji dla poleceń INSERT i UPDATE. Posiada wartość NULL w przypadku poleceń DELETE, TRUNCATE, znacznika FOR EACH STATEMENT oraz operacji wykonywanych w języku SQL.
- TG_NAME – nazwa wykonywanego wyzwalacza;
- TG_WHEN – zwraca czas realizacji operacji: BEFORE lub AFTER;
- TG_LEVEL – zwraca poziom realizacji wyzwalacza: ROW lub STATEMENT;
- TG_OP – zwraca typ wykonanej operacji dla której wywołano wyzwalacz: INSERT, UPDATE, lub DELETE;
- TG_RELID, TG_RELNAME – OID i nazwa tabeli, dla której uruchomiono wyzwalacz;
- TGTG _NARGS, TG_ARGV[] – Liczba argumentów i ich kolekcja, przekazanych do funkcji wyzwalacza.
Wyzwalacze wykorzystujemy najcześciej w następujących sytuacjach:
- kaskadowa aktualizacja danych w powiązanych tabelach;
- sprawdzanie poprawności danych na podstawie wartości przechowywanych w dowolnych tabelach (w przeciwieństwie do zawężenia CHECK, za pomocą którego możemy odwołać się jedynie do bieżącej tabeli);
- równoczesne sprawdzanie zmodyfikowanych danych w dowolnej liczbie rekordów tabeli;
- modyfikacje danych w bazach niespełniających wymogów trzeciej postaci normalnej. W bazach tego typu przechowywane są informacje nadmiarowe (redundantne) i modyfikacja danych w jednej tabeli może wiązać się z koniecznością zmiany tych danych w innych tabelach;
- wywoływanie predefiniowanych lub zdefiniowanych przez użytkownika komunikatów błędu;
- monitorowanie aktywności użytkowników;
CREATE FUNCTION nazwa ([typ_danych [, ]]) RETURNS typ_wyniku AS definicja LANGUAGE nazwa_jezyka
Polecenia SQL i interfejsu psql pomagające przetwarzać opracowane funkcje.
-- Wyświetlenie funkcji użytkownika - polecenie z interfejsu psql \df -- Wyświetlenie funkcji użytkownika - polecenie SQL - tablica pg_proc \d pg_proc -- Polecenie SQL wyświetlające zawartość procedury SELECT prosrc FROM pg_proc WHERE proname='nazwa_funkcji' ; -- Polecenie modyfikujące procedurę lub je tworzące CREATE OR REPLASE FUNCTION ... -- Polecenie usuwające procedurę DROP FUNCTION nazwa_funkcji([lista typów])