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ĘCIU
iDLA 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żSTARY
jest dodawany doFROM
klauzula niejawnie. DlaWARTOŚCI
wyraż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
PO
zdarzenie, 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.