Тригер: переміщення видалених рядків до архівної таблиці


18

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

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

Як записати такий тригер в PostgreSQL?

Відповіді:


16

Вам просто потрібно перемістити старі дані в restrictions_deletedтаблицю, перш ніж вони будуть видалені. Це робиться з OLDтипом даних. Ви можете використовувати INSERTоператор regulalat і використовувати 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;

2
Ви можете замінити явний список значень стовпців чимось на кшталтVALUES((OLD).*)
KayEss,

1
Працює чудово, але create functionпотрібно зателефонувати раніше create trigger. І VALUES((OLD).*)хитрість, запропонована KayEss, приємна.
mivk

8

Якщо ви відкриті для іншого підходу, чи розглядали ви, як додати в таблицю 'видалений' булевий прапор, або замість нього «видалений_at».

Або ще краще, забороніть доступ CRUD до таблиць вашої бази даних та обробляйте аудиторський слід у вашому API транзакцій :)


+1 Спасибі - не підійде для мого випадку, але це приємний підхід, який використовує лише одну таблицю.
Адам Матан
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.