మాడ్యూల్ పాఠాలు (3/4)
ట్రిగ్గర్లకు పరిచయం
ట్రిగ్గర్ అనేది మ్యాజిక్ బాక్స్ (సెన్సార్), ఇది డేటాలో ఈవెంట్ను ఇన్సర్ట్ చేయడానికి, అప్డేట్ చేయడానికి లేదా తొలగించడానికి ముందు లేదా తర్వాత ఆటోమేటిక్గా లాజిక్ను రన్ చేస్తుంది.\nఅయితే, ప్రతిస్పందించడానికి టేబుల్కి బోధించే ముందు, మేము దానికి PL/pgSQLలో వ్రాసిన ప్రత్యేక "ట్రిగ్గర్ ఫంక్షన్"ని అందించాలి, అది సింథటిక్ ఫార్మాట్ని తిరిగి ఇవ్వడం ద్వారా ముగించాలి" ".
ఈ ఫంక్షన్లు కుండలీకరణాల్లో సాధారణ ఆర్గ్యుమెంట్లను అంగీకరించవు; బదులుగా వారు మేజిక్ అంతర్నిర్మిత వస్తువులను 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'forcenameuppercase' అని పిలవబడే ఒక ట్రిగ్గర్ ఫంక్షన్ను వ్రాయండి. ఇది ఏ () వాదనలను అంగీకరించదు.\nఇది TRIGGERని అందిస్తుంది. శరీర టెంప్లేట్ను సృష్టించండి.\n'NEW.first_name = UPPER(NEW.first_name);' అనే మ్యాజిక్ అసైన్మెంట్ ద్వారా మొత్తం ఇన్కమింగ్ ఆబ్జెక్ట్ను నిర్బంధించండి. ఆ తర్వాత రీషేప్ చేయబడిన కొత్త వేరియబుల్ని తిరిగి ఇవ్వండి.
సూచనను చూపించు
FUNCTION క్రియేట్ చేయండి లేదా రీప్లేస్ చేయండి force_uppercase_name() TRIGGERని $$ BEGIN NEW.first_name = UPPER(NEW.first_name); కొత్తగా తిరిగి; ముగింపు; $$ భాష plpgsql;
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది
దాడి చేసే వ్యక్తి ఉత్పత్తిపై హాస్యాస్పదంగా తక్కువ ధరను ఆదా చేయబోతున్న హానికరమైన అప్డేట్లను బ్లాక్ చేసే 'protect_price_drops()' అనే ట్రిగ్గర్ ఫంక్షన్ను సృష్టించండి.\n'IF NEW.unit_price < OLD.unit_price THEN' వంటి లాజిక్ని ఉపయోగించండి, ఇది స్థానిక మినహాయింపును పెంచుతుంది. 'రైజ్ మినహాయింపు ''ప్రెజ్జో నాన్ అబ్బాసబిల్!'';'.
సూచనను చూపించు
ప్రారంభించడానికి NEW.unit_price < OLD.unit_price ఆపై మినహాయింపును పెంచండి 'Prezzo నాన్ అబ్బాసబైల్!'; ముగింపు IF; కొత్తగా తిరిగి; ముగింపు;
3 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది