ทริกเกอร์: ย้ายแถวที่ถูกลบไปยังตารางเก็บถาวร


18

ฉันมีตารางเล็ก ๆ (~ 10 แถว) ที่เรียกว่าrestrictionsในฐานข้อมูล PostgreSQL ของฉันซึ่งค่าจะถูกลบและแทรกทุกวัน

ฉันต้องการเรียกตารางrestrictions_deletedที่ซึ่งทุกแถวที่ถูกลบrestrictionsจะถูกเก็บไว้โดยอัตโนมัติ เนื่องจากrestrictionsมีรหัสซีเรียลจะไม่มีการทำซ้ำ

ฉันจะเขียนทริกเกอร์ใน PostgreSQL ได้อย่างไร

คำตอบ:


16

คุณเพียงแค่ต้องย้ายข้อมูลเก่าลงในrestrictions_deletedตารางก่อนที่จะถูกลบ สิ่งนี้ทำกับOLDชนิดข้อมูล คุณสามารถใช้INSERTคำสั่งregulat และใช้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

หากคุณเปิดให้มีวิธีอื่นคุณได้พิจารณาเพิ่มการตั้งค่าสถานะบูลีน 'ลบ' ไปยังตารางหรือการประทับเวลา 'delete_at' แทน

หรือยังดีกว่าปฏิเสธการเข้าถึง CRUD ไปยังตารางฐานข้อมูลของคุณและจัดการกับหลักฐานการตรวจสอบใน API ธุรกรรมของคุณ :)


+1 ขอบคุณ - ใช้ไม่ได้กับกรณีของฉัน แต่เป็นวิธีการที่ดีที่ใช้เพียงตารางเดียวเท่านั้น
Adam Matan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.