ماڈیول اسباق (3/4)
محرکات کا تعارف
ٹرگر ایک جادوئی خانہ (ایک سینسر) ہوتا ہے جو ڈیٹا میں واقعہ داخل کرنے، اپ ڈیٹ کرنے یا حذف کرنے سے پہلے یا اس کے بعد خود بخود منطق کا ایک ٹکڑا چلاتا ہے۔\nکسی ٹیبل کو رد عمل کا اظہار کرنے کے لیے سکھانے سے پہلے، تاہم، ہمیں اسے PL/pgSQL میں لکھا ہوا ایک خاص "Trigger Function" دینا ہوگا جو کہ "synthetic" کہلاتا ہے "Synthetic" کہلاتا ہے۔
یہ فنکشن قوسین میں عام دلائل کو قبول نہیں کرتے ہیں۔ اس کے بجائے وہ جادوئی بلٹ ان آبجیکٹ 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 سال سے کم عمر کا کوئی نہیں (ہمارا ورچوئل چیک) یا، فرضی منطق سے ہٹ کر، ہم INSERT کے وقت پاس کی گئی 'first_name' سٹرنگ کو ہمیشہ ڈیٹا بیس میں بڑے حروف میں ذخیرہ کرنے کے لیے مجبور کرنا چاہتے ہیں، کسی بھی JS کلائنٹ فارمیٹنگ کو نظر انداز کرتے ہوئے۔ یہ کوئی () دلائل قبول نہیں کرتا ہے۔\nیہ TRIGGER لوٹاتا ہے۔ باڈی ٹیمپلیٹ بنائیں۔\nجادو اسائنمنٹ 'NEW.first_name = UPPER(NEW.first_name);' کے ذریعے پوری آنے والی چیز کو زبردستی تفویض کریں۔ پھر نئی شکل والے نئے متغیر کو واپس کریں۔
اشارہ دکھائیں۔
فنکشن بنائیں یا بدلیں force_uppercase_name() $$ شروع ہونے پر ٹرگر کو واپس کریں NEW.first_name = UPPER(NEW.first_name)؛ نیا لوٹنا؛ اختتام $$ LANGUAGE plpgsql;
3 کوششوں کے بعد حل دستیاب ہے۔
ایک ٹرگر فنکشن 'protect_price_drops()' بنائیں جو بدنیتی پر مبنی اپ ڈیٹس کو روکتا ہے جہاں حملہ آور کسی پروڈکٹ پر مضحکہ خیز طور پر کم قیمت بچانے والا ہے۔\n'IF NEW.unit_price < OLD.unit_price THEN' جیسی منطق کا استعمال کریں، ایک مقامی استثنا کو بڑھاتے ہوئے جو ہر چیز کو کریش کر دیتا ہے سوائے fatalp/PLQ کے استعمال کے ہر چیز کو نیچے لاتا ہے۔ 'رائز استثنیٰ ''پریززو نان اباسیبل!''؛'۔
اشارہ دکھائیں۔
شروع کریں اگر NEW.unit_price < OLD.unit_price پھر مستثنیٰ اضافہ کریں 'Prezzo non abbassabile!'; END IF; نیا لوٹنا؛ اختتام
3 کوششوں کے بعد حل دستیاب ہے۔