Dopóki wprowadzasz zmiany tylko w wierszu, który uruchomił wyzwalacz, o wiele prostsze (i tańsze) jest użycie BEFORE UPDATE
wyzwalacz, który może wprowadzać zmiany w new.complete_flag
przed zapisaniem do tabeli, zamiast uruchamiania UPDATE
oświadczenie po tym, jak już tam jest.
Możesz również ograniczyć wyzwalacz do aktualizacji określonego pola za pomocą UPDATE OF <column>
klauzula CREATE TRIGGER
oświadczenie.
Wynik końcowy wyglądałby mniej więcej tak:
CREATE FUNCTION completed_timestamp() RETURNS trigger AS $$
LANGUAGE plpgsql
BEGIN
IF new.complete_flag = 1 and old.completed_flag = 0 THEN
new.complete_time := current_timestamp;
END IF;
RETURN new;
END;
$$;
CREATE TRIGGER update_timestamp
BEFORE UPDATE OF completed_flag ON tbl_pXXXX
FOR EACH ROW
EXECUTE PROCEDURE completed_timestamp();