ฉันกำลังพยายามทริกเกอร์ฟังก์ชันดรอปอัตโนมัติเมื่อตารางถูกดร็อป และฉันก็ไม่รู้ว่าต้องทำอย่างไร
TL;DR: มีวิธีใดที่จะทริกเกอร์ฟังก์ชันดร็อปเมื่อตารางใดตารางหนึ่งถูกดร็อปหรือไม่ (POSTGRESQL 11.7)
คำอธิบายโดยละเอียด
ฉันจะพยายามอธิบายปัญหาของฉันโดยใช้กรณีการใช้งานที่เรียบง่ายพร้อมชื่อจำลอง
ฉันมีสามตาราง: sensor1, sensor2 และ sumSensors;
FUNCTION (sumdata) ถูกสร้างขึ้นเพื่อ INSERT ข้อมูลบนตาราง sumSensors ภายในฟังก์ชันนี้ ฉันจะดึงข้อมูลจากตาราง sensor1 และ sensor2 และแทรกผลรวมลงใน sumSensors ของตาราง
ทริกเกอร์ถูกสร้างขึ้นสำหรับตารางเซ็นเซอร์แต่ละตัวซึ่งมีลักษณะดังนี้:
สร้างทริกเกอร์ trig1 หลังจากใส่เซ็นเซอร์ 1 สำหรับแต่ละแถว เรียกใช้ฟังก์ชัน sumdata();
ตอนนี้ เมื่อ แทรกแถวใหม่ บนโต๊ะ sensor1 หรือ sensor2 ฟังก์ชัน sumdata จะถูกดำเนินการและ แทรกผลรวมของค่าสุดท้ายจากทั้งสองบนตาราง sumSensors
หากฉันต้องการ DROP FUNTION sumdata CASCADE;
ทริกเกอร์จะถูกลบออกจากตาราง sensor1 และ sensor2 โดยอัตโนมัติ จนถึงตอนนี้ทุกอย่างก็เรียบร้อยดี! แต่นั่นไม่ใช่สิ่งที่ฉันต้องการ
ปัญหาของฉันคือ:
ถาม: และถ้าฉันแค่ DROP TABLE sumSensors CASCADE;
? จะเกิดอะไรขึ้นกับฟังก์ชันที่ตั้งใจจะแทรกลงในตารางนี้?
ตอบ: ตามที่คาดไว้ เนื่องจากไม่มีการเชื่อมโยงระหว่างตาราง sumSensors และฟังก์ชัน sumdata ฟังก์ชันจะไม่ถูกทิ้ง (ยังคงมีอยู่)! สิ่งเดียวกันนี้เกิดขึ้นกับทริกเกอร์ที่ใช้งาน (ยังคงมีอยู่) ซึ่งหมายความว่าเมื่อมีการแทรกแถวใหม่บนตารางเซ็นเซอร์ ข้อมูลรวมของฟังก์ชันจะถูก ดำเนินการและเสียหาย ซึ่งนำไปสู่ความล้มเหลว (แม้แต่ INSERT ที่ทริกเกอร์การทำงานของฟังก์ชันก็จะไม่ถูกแทรกจริง ๆ )
มีวิธีทริกเกอร์ฟังก์ชั่นดร็อปเมื่อตารางใดตารางหนึ่งถูกดร็อปหรือไม่?
ขอบคุณล่วงหน้า