Wyzwalacze w Postgresie nie dostarczają bezpośrednio kodu wyzwalacza, ale wywołują funkcję wyzwalacza , które można wywołać z dowolnej liczby wyzwalaczy, chociaż często są one dostosowane do jednego konkretnego zdarzenia w jednej konkretnej tabeli.
Funkcja wyzwalania:
CREATE OR REPLACE FUNCTION trg_some_tbl_foo()
RETURNS trigger AS
$func$
BEGIN
INSERT INTO some_tbl(key, name, describe) -- or some_other_tbl?
VALUES (OLD.key, OLD.name, OLD.describe);
RETURN OLD;
END
$func$ LANGUAGE plpgsql
CREATE TRIGGER foo -- not: "CREATE OR REPLACE" !
AFTER UPDATE OR DELETE ON some_tbl
FOR EACH ROW EXECUTE PROCEDURE trg_some_tbl_foo()
-
Zrób to
AFTER
wyzwalacz w celu uproszczenia. ABEFORE
wyzwalacz musiałbyRETURN NEW
aby aktualizacje działały, aleNEW
nie jest widoczny wDELETE
cyngiel. Więc potrzebujeszIF TG_OP = ...
itp. -
Zawsze dostarczaj listę docelową dla utrwalonego
INSERT
sprawozdania. To jest tak samo złe w wyzwalaczu Oracle. -
Prawdopodobnie masz tabelę z
serial
kolumna. Tylko nie wspominaj o tym we wstawce, następny identyfikator z sekwencji jest wstawiany automatycznie.
Istnieje wiele przykładów kodu tutaj na SO.