דילוג לתוכן המרכזי
מודול 12 · שיעור 3 מתוך 447/57 בקורס~15 min
שיעורי מודול (3/4)

מבוא לטריגרים

טריגר הוא תיבת קסם (חיישן) שמריצה באופן אוטומטי פיסת לוגיקה לפני או אחרי אירוע הוספה, עדכון או מחיקה בנתונים.\nלפני ללמד טבלה להגיב, עם זאת, עלינו לתת לה "פונקציית טריגר" מיוחדת שנכתבה ב-PL/pgSQL שחייבת להסתיים בהחזרת פורמט סינתטי בשם "TRIGGER".

פונקציות אלו אינן מקבלות ארגומנטים רגילים בסוגריים; במקום זאת הם מציעים בחינם את האובייקטים המובנים הקסומים 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 (הבדיקה הוירטואלית שלנו) או, מעבר להיגיון הבדיוני, אנחנו רוצים לאלץ את מחרוזת ה-'first_name' שהועברה בזמן INSERT להיות מאוחסנת תמיד באותיות רישיות במסד הנתונים, תוך התעלמות מכל עיצוב של לקוח JS.\nכתוב פונקציית טריגר בשם 'force_uppercase_name()'. הוא לא מקבל ארגומנטים ().\nהוא מחזיר TRIGGER. צור את תבנית הגוף.\nהקצאה בכוח את כל האובייקט הנכנס באמצעות הקצאת הקסם 'NEW.first_name = UPPER(NEW.first_name);'. לאחר מכן החזר את המשתנה NEW שעוצב מחדש.

טוען עורך...
הצג רמז

CREATE OR REPLACE FUNCTION force_uppercase_name() מחזיר את הטריגר כ$$ BEGIN 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', העלאת חריג מקורי שגורם לכל דבר להתרסק.\nA fatsg form. יוצא מן הכלל ''Prezzo non abbassabile!'';'.

טוען עורך...
הצג רמז

BEGIN IF NEW.unit_price < OLD.unit_price אז העלה את החריגה 'Prezzo non abbassabile!'; END IF; החזר חדש; סוֹף;

הפתרון זמין לאחר 3 ניסיונות