Disparador: mova linhas excluídas para a tabela de arquivamento

18

Eu tenho uma tabela pequena (~ 10 linhas) chamada restrictionsno meu banco de dados PostgreSQL, onde os valores são excluídos e inseridos diariamente.

Gostaria de ter uma tabela chamada restrictions_deleted, onde todas as linhas excluídas restrictionsserão armazenadas automaticamente. Como restrictionspossui um ID de série, não haverá duplicatas.

Como escrevo esse gatilho no PostgreSQL?

Adam Matan
fonte

Respostas:

15

Você só precisa mover os dados antigos para a restrictions_deletedtabela antes de serem excluídos. Isso é feito com o OLDtipo de dados. Você pode usar uma INSERTinstrução regulat e usar os OLDvalores como os valores a serem inseridos.

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
fonte
2
Você pode substituir a lista explícita de valores da coluna com algo parecidoVALUES((OLD).*)
KayEss
11
Funciona bem, mas create functionprecisa ser chamado antes create trigger. E o VALUES((OLD).*)truque sugerido por KayEss é bom.
mivk
8

Se você está aberto a uma abordagem diferente, já pensou em adicionar um sinalizador booleano 'excluído' à tabela ou um carimbo de data / hora 'delete_at'.

Ou melhor ainda, negue acesso CRUD às tabelas do banco de dados e lide com a trilha de auditoria em sua API transacional :)

Jack Douglas
fonte
+1 Obrigado - não funcionaria no meu caso, mas é uma boa abordagem que usa apenas uma única tabela.
Adam Matan