मॉड्यूल पाठ (3/4)
ट्रिगर्स का परिचय
ट्रिगर एक मैजिक बॉक्स (एक सेंसर) है जो डेटा में इवेंट डालने, अपडेट करने या हटाने से पहले या बाद में स्वचालित रूप से तर्क का एक टुकड़ा चलाता है।\nकिसी तालिका को प्रतिक्रिया करने के लिए सिखाने से पहले, हमें इसे पीएल/पीजीएसक्यूएल में लिखा एक विशेष "ट्रिगर फ़ंक्शन" देना होगा जो "ट्रिगर" नामक सिंथेटिक प्रारूप को वापस करके समाप्त होना चाहिए।
ये फ़ंक्शन कोष्ठक में सामान्य तर्क स्वीकार नहीं करते हैं; इसके बजाय वे जादुई अंतर्निहित ऑब्जेक्ट NEW और OLD निःशुल्क प्रदान करते हैं, जिसमें सेंसर द्वारा देखी जा रही तालिका से मूल या आने वाली पंक्ति डेटा होता है!
CREATE OR REPLACE FUNCTION audit_deletions()
RETURNS TRIGGER AS $$
BEGIN
-- OLD.id is magically the id value of the poor record being deleted
INSERT INTO audit_log (table_name, record_id, action)
VALUES (TG_TABLE_NAME, OLD.id, 'DELETE');
RETURN OLD; -- Triggers before a Delete route must grant the exit
END;
$$ LANGUAGE plpgsql;यह प्रक्रिया लॉग में लिखने का कठिन कार्य करती है। बाद में, दूसरे चरण में, इसे उस तालिका की घटनाओं से स्थायी रूप से जोड़ दिया जाएगा जिसे हम सुरक्षित रखना चाहते हैं।
खुद कोशिश करना
हमें ग्राहकों की सुरक्षा करने की आवश्यकता है: 18 वर्ष से कम उम्र का कोई नहीं (हमारी वर्चुअल जांच) या, काल्पनिक तर्क से परे, हम किसी भी JS क्लाइंट फ़ॉर्मेटिंग को अनदेखा करते हुए, INSERT समय पर पारित 'first_name' स्ट्रिंग को हमेशा डेटाबेस में अपरकेस में संग्रहीत करने के लिए बाध्य करना चाहते हैं।\n'force_uppercase_name()' नामक एक ट्रिगर फ़ंक्शन लिखें। यह कोई () तर्क स्वीकार नहीं करता।\nयह TRIGGER लौटाता है। बॉडी टेम्प्लेट बनाएं।\nमैजिक असाइनमेंट 'NEW.first_name = UPPER(NEW.first_name);' के माध्यम से संपूर्ण आने वाली ऑब्जेक्ट को बलपूर्वक असाइन करें। फिर पुनः आकार दिया गया नया वेरिएबल वापस करें।
संकेत दिखाएँ
फ़ंक्शन बनाएं या बदलें Force_uppercase_name() $$ शुरू होते ही ट्रिगर लौटाता है new.first_name = UPPER(NEW.first_name); नया लौटें; अंत; $$ भाषा plpgsql;
3 प्रयासों के बाद समाधान उपलब्ध है
एक ट्रिगर फ़ंक्शन 'प्रोटेक्ट_प्राइस_ड्रॉप्स ()' बनाएं, जो दुर्भावनापूर्ण अपडेट को ब्लॉक करता है, जहां एक हमलावर किसी उत्पाद पर हास्यास्पद रूप से कम कीमत बचाने वाला होता है।
संकेत दिखाएँ
प्रारंभ करें यदि NEW.unit_price < OLD.unit_price तब अपवाद बढ़ाएं 'प्रेज़ो नॉन एब्बासैबाइल!'; अंत यदि; नया लौटें; अंत;
3 प्रयासों के बाद समाधान उपलब्ध है