Napisz funkcję wyzwalającą. Coś takiego:
CREATE OR REPLACE FUNCTION trg_backup_row()
RETURNS trigger AS
$BODY$
BEGIN
INSERT INTO other_tbl
SELECT (OLD).*, t.other_col -- all columns of from old table
-- SELECT OLD.col1, OLD.col2, t.other_col -- alternative: some cols from old tbl
FROM third_tbl t
WHERE t.col = OLD.col -- link to third table with info from deleted row
AND <unique_condition_to_avoid_multiple_rows_if_needed>;
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE;
I wyzwalacz ON DELETE . Tak:
CREATE TRIGGER delaft
AFTER DELETE
ON tbl
FOR EACH ROW
EXECUTE PROCEDURE trg_backup_row();
Kluczowe elementy
-
Najlepiej, aby był to wyzwalacz
PO USUNIĘCIUiDLA KAŻDEGO WIERSZU. -
Aby zwrócić wszystkie kolumny ze starej tabeli, użyj składni
(OLD).*. Zobacz instrukcję dotyczącą dostępu do typów złożonych . AlternatywnieSTARY.*jest również poprawną składnią, ponieważSTARYjest dodawany doFROMklauzula niejawnie. DlaWARTOŚCIwyrażenie musiałoby być(STARY).*, chociaż. Na przykład:INSERT INTO other_tbl VALUES((OLD).*, some_variable) -
Możesz dołączyć wartości z dowolnej innej tabeli, jak pokazuję. Upewnij się tylko, że otrzymasz jeden wiersz lub utworzysz wiele wpisów.
-
Gdy wyzwalacz odpala
POzdarzenie, funkcja możeRETURN NULL.
Informacje o widoczności
W odpowiedzi na uważny komentarz @couling.
Klucze obce mogą być deklarowane jako DEFERRED
, odroczy to tylko sprawdzenie integralności, a nie samo usunięcie. Wiersze, które są usuwane w wyzwalaczach wykonanych przed tym, który jest pod ręką lub przez PO USUNIĘCIU KASKADY klucze obce nie będą już widoczne w tym czasie to PO USUNIĘCIU wywoływany jest wyzwalacz. (Oczywiście wszystko dzieje się w jednej transakcji. Żadne z tych szczegółów nie mają znaczenia dla innych transakcji, w których zauważą się wszystkie lub żadne efekty. Więcej informacji na temat Izolacja modelu MVCC i transakcji
.)
Dlatego jeśli chcesz uwzględnić wartości z wierszy zależnych w taki sposób w swoim INSERT , pamiętaj, aby wywołać ten wyzwalacz przed te wiersze zostaną usunięte.
Być może będziesz musiał uruchomić ten wyzwalacz PRZED USUNIĘCIEM .
Lub może to oznaczać, że musisz odpowiednio uporządkować wyzwalacze, PRZED wyzwalacze pojawiają się przed PO oczywiście wyzwalacze. A wyzwalacze na tym samym poziomie są wykonywane w kolejności alfabetycznej
.
Jednak tak długo, jak jestem tutaj super precyzyjny, mogę również dodać, że zmiany wprowadzone w wierszu (lub wierszach zależnych) w innych PRZED wyzwalacze są również widoczne tylko wtedy, gdy są wywoływane przed ten.
Moja rada, aby to było PO wyzwalacz był mniej podatny na komplikacje i tańszy, jeśli inny wyzwalacz może anulować (cofnąć) DELETE w połowie operacji - o ile żadne z powyższych nie ma zastosowania.