Kích hoạt: di chuyển các hàng đã xóa vào bảng lưu trữ


18

Tôi có một bảng nhỏ (~ 10 hàng) được gọi restrictionstrong cơ sở dữ liệu PostgreQuery của tôi, nơi các giá trị bị xóa và chèn vào hàng ngày.

Tôi muốn có một bảng được gọi restrictions_deleted, trong đó mỗi hàng bị xóa restrictionssẽ được lưu trữ tự động. Vì restrictionscó một id nối tiếp, sẽ không có bản sao.

Làm thế nào để tôi viết một trình kích hoạt như vậy trong PostgreSQL?

Câu trả lời:


15

Bạn chỉ cần di chuyển dữ liệu cũ vào restrictions_deletedbảng trước khi nó bị xóa. Điều này được thực hiện với OLDkiểu dữ liệu. Bạn có thể sử dụng INSERTcâu lệnh điều chỉnh và sử dụng các OLDgiá trị làm giá trị được chèn.

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
Bạn có thể thay thế danh sách giá trị cột rõ ràng bằng một cái gì đó nhưVALUES((OLD).*)
KayEss

1
Hoạt động tốt, nhưng create functioncần phải được gọi trước create trigger. Và VALUES((OLD).*)mẹo được đề xuất bởi KayEss là tốt đẹp.
mivk

8

Nếu bạn đang mở cho một cách tiếp cận khác, thay vào đó, bạn đã xem xét việc thêm cờ Boolean 'đã xóa vào bảng hoặc dấu thời gian' xóa_at '.

Hoặc tốt hơn nữa, từ chối truy cập CRUD vào các bảng cơ sở dữ liệu của bạn và xử lý dấu vết kiểm toán trong API giao dịch của bạn :)


+1 Cảm ơn - sẽ không hiệu quả với trường hợp của tôi, nhưng đó là một cách tiếp cận tốt đẹp chỉ sử dụng một bảng duy nhất.
Adam Matan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.