Триггер: переместить удаленные строки в таблицу архива

18

У меня есть маленькая (~ 10 строк) таблица, вызываемая restrictionsв моей базе данных PostgreSQL, где значения удаляются и вставляются ежедневно.

Я хотел бы иметь таблицу с именем restrictions_deleted, где каждая строка, которая удаляется изrestrictions будет сохранена автоматически. Так как restrictionsимеет серийный идентификатор, дубликатов не будет.

Как мне написать такой триггер в PostgreSQL?

Адам Матан
источник

Ответы:

16

Вам просто нужно переместить старые данные в restrictions_deletedтаблицу, прежде чем они будут удалены. Это делается с OLDтипом данных. Вы можете использовать оператор regulat INSERTи использовать OLDзначения в качестве значений для вставки.

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
источник
2
Вы можете заменить явный список значений столбцов чем-то вродеVALUES((OLD).*)
KayEss
1
Работает нормально, но create functionнужно позвонить раньше create trigger. И VALUES((OLD).*)трюк, предложенный KayEss, хорош.
mivk
8

Если вы открыты для другого подхода, рассматривали ли вы вопрос о добавлении в таблицу «удаленного» логического флага или вместо него временной метки «Удалено».

Или, что еще лучше, запретите CRUD доступ к таблицам вашей базы данных и обработайте контрольный журнал в своем транзакционном API :)

Джек Дуглас
источник
+1 Спасибо - не подойдет для моего случая, но это хороший подход, который использует только одну таблицу.
Адам Матан