মূল কন্টেন্টে যান
মডিউল 12 · 3-এর পাঠ 4কোর্সে 47/57~15 min
মডিউল পাঠ (3/4)

ট্রিগার পরিচিতি

একটি ট্রিগার হল একটি ম্যাজিক বাক্স (একটি সেন্সর) যা স্বয়ংক্রিয়ভাবে ডেটাতে একটি সন্নিবেশ, আপডেট বা ইভেন্ট মুছে ফেলার আগে বা পরে যুক্তির একটি অংশ চালায়৷\nএকটি সারণীকে প্রতিক্রিয়া জানাতে শেখানোর আগে, যদিও, আমাদের এটিকে PL/pgSQL-এ লেখা একটি বিশেষ "ট্রিগার ফাংশন" দিতে হবে যা "সিন্থেটিক ইআরআই" নামক একটি সিন্থেটিক রিটার্ন করে শেষ করতে হবে৷

এই ফাংশন বন্ধনীতে স্বাভাবিক আর্গুমেন্ট গ্রহণ করে না; পরিবর্তে তারা NEW এবং OLD বিনামূল্যের জাদু বিল্ট-ইন অবজেক্ট অফার করে, যেটিতে সেন্সর যে টেবিলটি দেখছে তার মূল বা ইনকামিং সারি ডেটা রয়েছে!

SQL
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;

এই পদ্ধতিটি লগ লেখার কঠিন কাজ করে। পরবর্তীতে, দ্বিতীয় ধাপে, আমরা যে টেবিলটিকে রক্ষা করতে চাই তার ইভেন্টগুলির সাথে এটি স্থায়ীভাবে সংযুক্ত হবে।

নিজে চেষ্টা করে দেখুন

ব্যায়াম#sql.m12.l3.e1
প্রচেষ্টা: 0লোড হচ্ছে...

আমাদের গ্রাহকদের রক্ষা করতে হবে: 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 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#sql.m12.l3.e2
প্রচেষ্টা: 0লোড হচ্ছে...

একটি ট্রিগার ফাংশন 'protect_price_drops()' তৈরি করুন যা দূষিত আপডেটগুলিকে ব্লক করে যেখানে একজন আক্রমণকারী একটি পণ্যের হাস্যকরভাবে কম দাম সংরক্ষণ করতে চলেছে৷\n'IF NEW.unit_price < OLD.unit_price THEN'-এর মতো যুক্তি ব্যবহার করুন, একটি নেটিভ ব্যতিক্রম উত্থাপন করুন যা PLSQ/PLQ ফর্মের বিপর্যয় ব্যতীত সমস্ত কিছুকে হ্রাস করে৷ 'বাদ তুলুন' 'প্রেজো নন অ্যাবাসাবিলে!';'।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

শুরু হলে NEW.unit_price < OLD.unit_price তাহলে ব্যতিক্রম বাড়ান 'Prezzo non abbassabile!'; শেষ IF; নতুন রিটার্ন; শেষ;

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ