Wyzwalacz: przenieś usunięte wiersze do tabeli archiwum

18

Mam małą (~ 10 wierszy) tabelę wywoływaną restrictionsw mojej bazie danych PostgreSQL, w której wartości są codziennie usuwane i wstawiane.

Chciałbym mieć tabelę o nazwie restrictions_deleted, w której każdy usuwany wiersz restrictionsbędzie zapisywany automatycznie. Ponieważ restrictionsma identyfikator seryjny, nie będzie duplikatów.

Jak napisać taki wyzwalacz w PostgreSQL?

Adam Matan
źródło

Odpowiedzi:

16

Musisz tylko przenieść stare dane do restrictions_deletedtabeli, zanim zostaną usunięte. Odbywa się to z OLDtypem danych. Możesz użyć INSERTinstrukcji regulat i użyć OLDwartości jako wartości do wstawienia.

CREATE TRIGGER moveDeleted
BEFORE DELETE ON restrictions 
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();


CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
       INSERT INTO restrictions_deleted VALUES(OLD.column1, OLD.column2,...);
       RETURN OLD;
    END;
$$ LANGUAGE plpgsql;
DrColossos
źródło
2
Możesz zastąpić jawną listę wartości kolumn czymś takimVALUES((OLD).*)
KayEss 16.04.15
1
Działa dobrze, ale create functiontrzeba to wcześniej wywołać create trigger. A VALUES((OLD).*)sztuczka zasugerowana przez KayEss jest fajna.
mivk
8

Jeśli jesteś otwarty na inne podejście, czy zastanowiłeś się nad dodaniem do tabeli flagi „usuniętej” wartości logicznej lub znacznika czasu „usunięty”.

Albo jeszcze lepiej: odmów dostępu CRUD do tabel bazy danych i obsłuż ścieżkę audytu w transakcyjnym interfejsie API :)

Jack Douglas
źródło
+1 Dzięki - nie zadziałałoby w moim przypadku, ale to miłe podejście, które wykorzystuje tylko jeden stół.
Adam Matan