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?

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;

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 :)


+1 Dzięki - nie zadziałałoby w moim przypadku, ale to miłe podejście, które wykorzystuje tylko jeden stół.
Adam Matan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.