PracticU

יצירת טריגר Trigger instead of

בלי כתוביותעם כתוביות
PracticU › קורס DBA אפליקטיבי - שפת SQL למתחילים › יצירת טריגר Trigger instead of
מילון מושגים:
טריגר - קוד במסד נתונים שמופעל אוטומטית בתגובה לאירוע בטבלה, כמו הוספה, עדכון או מחיקה של שורה.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
View - רכיב שאחראי על הצגת המידע למשתמש (התצוגה) בדפוס MVC. גם טבלה וירטואלית מבוססת שאילתה במסד נתונים.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
פונקציה - קטע קוד בעל שם שמבצע משימה מוגדרת, מקבל ערכי קלט (פרמטרים) ויכול להחזיר תוצאה. מאפשרת לארגן קוד ולהשתמש בו שוב.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
DELETE - פקודת SQL למחיקת שורות מטבלה. גם שיטת HTTP לבקשת מחיקה של משאב בשרת.

יצירת טריגר Trigger instead of
ההרצאה ממשיכה בטריגרים מסוג INSTEAD OF, שמחליף את פעולת ה-DML במקום להפעיל אותה, ומראה איך משתמשים בו כדי לאפשר פעולה שנכשלת.
טריגר INSTEAD OF
1. הרעיון: הפעולה המקורית לא מתבצעת, ובמקומה מתבצע הקוד שבתוך הטריגר.
2. דוגמה לערך ברירת מחדל: בטבלת Employees העמודה LastName אינה מאפשרת NULL, ולכן הכנסה שמספקת רק FirstName נכשלת. טריגר INSTEAD OF על INSERT מקבל את הערך מטבלת inserted, מוסיף ערך ברירת מחדל ל-LastName ומכניס את השורה.
3. תוצאה: ההכנסה המקורית מצליחה בלי לשנות את הקוד של האפליקציה.
INSTEAD OF על View
1. הבעיה: View שמחבר כמה טבלאות אינו ניתן להכנסה ישירה, כי השינוי נוגע בכמה טבלאות.
2. הפתרון: יוצרים טריגר INSTEAD OF INSERT על ה-View. הטריגר מחפש את מזהה הטריטוריה לפי התיאור, מכניס את העובד לטבלת Employees ואת הקשר לטבלת EmployeeTerritories.
3. מזהה שנוצר: הפונקציה שמחזירה את ערך ה-Identity האחרון מאפשרת להשתמש במזהה של העובד שנוסף זה עתה.
סדר הפעלת טריגרים
1. sp_settriggerorder: פרוצדורה של המערכת שקובעת איזה טריגר ירוץ ראשון ואיזה אחרון. הפרמטרים הם שם הטריגר, הסדר (First או Last) וסוג הפעולה (Insert, Update או Delete).
2. סדר ברירת מחדל: בלי קביעה, הטריגרים רצים ללא סדר קבוע.
3. מגבלה: אפשר לקבוע סדר רק לטריגרים מסוג AFTER, ולא לטריגרים מסוג INSTEAD OF.
שימו לב
- בתוך הטריגר משתמשים ב-SET NOCOUNT ON כדי למנוע הודעות על שורות שנכתבו מאחורי הקלעים.
בסיום יודעים להחליף פעולה בטריגר, לאפשר הכנסה דרך View ולקבוע את סדר ההפעלה של הטריגרים.
השיעור הבא בקורס: טריגר רק על עמודה אחת

פרקי ההרצאה: יצירת טריגר Trigger instead of

  1. 00:00

    מה משמעות INSTEAD OF בטריגר

  2. 01:14

    כשל הכנסת שורה כשעמודה חובה חסרה

  3. 02:11

    הגדרת טריגר שמחליף את ההכנסה

  4. 03:26

    שימוש בערך ברירת מחדל בטריגר

  5. 05:09

    View על טבלאות Employees ו-Territories

  6. 07:45

    שגיאת View שאינו ניתן לעדכון

  7. 09:56

    טריגר INSTEAD OF INSERT על View

תמלול ההרצאה: יצירת טריגר Trigger instead of

הטקסט המלא של הדקות הראשונות בהרצאה «יצירת טריגר Trigger instead of» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:20

    טריגר מסוג Instead of מתבצע במקום פעולה שהפעילה את הטריגר, דהיינו במקום פעולת ה-DML. אמור מעתה: בהינתן טריגר מסוג Instead of, פעולת ה-DML שאליה הוא מאזין לא תתבצע, ותחת זאת יתבצע הקוד שנמצא תחת הטריגר.

  2. 00:45

    בואו ננסה לראות דוגמה. אני נכנס לתוך טבלת אימפלואיז. כניסה לתוך טבלת אימפלואיז מגלה לי שמעבר ל-employee שהוא מפתח ואני לא צריך לספק אותו אלא הוא מחולל אוטומטית כאידנטיותי, אנחנו נראה את זה בשיעורים הבאים.

  3. 00:59

    אבל עמודות lastname ו-firstname אלו הן העמודות היחידות שהלאו-נאלס שלהן מסומן כ-false, כלומר בלתי ניתן לשים בהן false, חייבים להכניס בהן ערך.

  4. 01:13

    אי לכך, בהינתן פקודת ה-insert הבאה, פקודת insert זו מכניסה שורה חדשה לתוך טבלת הידיוז אולם מאכלסת רק את ה-firstname. זו פקודה שעתידה להיכשל, היא נותנת לי גם הודעה מאוד מאוד ברורה:

  5. 01:44

    cannot insert value null into lastname. lastname לא יכול לקבל null, ואני חייב לספק כאן ב-insert גם ערך עבור עמודה זו.

  6. 01:55

    על מנת לתקן insert זה, על מנת שהוא כן יתבצע, במידה שיש לי מערכות שכן מבצעות אותו, אפליקציות שאני לא רוצה שהן ייכשלו, ואני רוצה להכניס ל-lastname איזשהו ערך דיפולטי, הדרך לעשות זאת זה לעשות את זה על ידי טריגר.

  7. 02:14

    בואו ניצור את הטריגר שלנו, פטיגרי טריגר, שוב פעם אנחנו ננסה לעשות הלוגו, לתת לו שם, הוא ירוץ לי על קבלת אינטלואידס, אבל המשמעות שלו זה instead of לפעולה שאנחנו מאזינים אני אעבור תעולת insert.

  8. 02:50

    בכל פעם שאני אריץ פקודת insert לא תתבצע פקודת הinsert עצמה אלא יתבצע גוף טריגר כפי שיירשם להלן instead of insert as ואני אבצע insert נגד כאן ברגע שאני אכניס לתוך טבלת Include אני אציין גם את ה-First Name גם את ה-Last Name אבל אני תחילה אצטרך לקחת את הערך שהמשתמש

  9. 03:32

    רשם בשאילתה ולכן אני אגש לתוך טבלת שראינו אותה, היא מסרטת שהיא מכילה לי את השורה החדשה בתוך השורה החדשה אנחנו נרצה לקחת את ה-First Name בהתאמה הוא ייכנס לעמודת First Name החדשה בתוך טבלת ועבור הפלסטנינג שלא סופק לי אני אתן ערך דיפולטי, דיפולט value שייכנס לי כלסטנינג.

  10. 04:03

    כעת משיצרתי לעצמי את הטריגר קיבלתי הודעת אינדיקציה. מהמערכת שהטריגר נוצר בהצלחה, פעולת האינסרט שניסיתי לבצע לא מזמן ונכשלה, הייתי תצליח.

  11. 04:17

    לא רק שהצליחה, העדכון בוצע גם בטבלת אינסרט ולאחר מכן בוצע גם העדכון, גם עבור first name וגם עבור last name, אנחנו נכתבות את זה גלול כלפי מטה ואנחנו נגלה שהצלחנו להכניס כרגע את העובד אבי כפי שנתן לנו בשאילתה, את הערך הזה הוא לקח מהשאילתה לעומת default value שהוא לקח את זה כhardcoded מתוך הטריגר שאותו אנחנו קיבלנו.

  12. 05:07

    חברים וחברות, בדוגמה הבאה אני ארצה לעשות עדכון ל-vue, אבל שאני אצור אותו עבור מספר טבלאות. את ה-view הבא אנחנו ניצור על טבלת Employees.

  13. 05:23

    בטבלת Employees אנחנו רואים שיש לנו קשר עם Employee Territory. Employee Territory נותן לי עבור כל קוד עובד מהם הטריטוריות שלו, ומה-employee Territory אני יכול ללכת לטבלת Territories, ושם לראות שעבור כל קוד טריטוריה מהו ה-Territory Description.

  14. 05:46

    בואו ונייצר את השאילתה המתאימה לצורך כך, וממנה נגזור את ה-View המתאים, אשר יוליך אותנו ישירות לעבר דוגמה נוספת של יצירת טריגרים. Select From Employees ניתן איזה אליאס של E1. Employees Territories MT ו-Territories נקרא לזה T, where E.employeeID אנחנו מקשרים אותו ל-MT.

  15. 06:26

    EmployeeID. אנחנו לא שוכחים לעשות את הג'וין הנוסף בין שני הטבלאות הנוספות שלפנינו מ-t.territoryid לתוך t.territoryid. הצליחנו לעשות את הג'וין וכעת כל הטבלאות לפנינו ואנחנו צריכים רק לשלוח e.firstName.lastName ואנחנו גם שולחים מתוך t את ה-territory description.

  16. 07:04

    בואו נריץ ונקבל פלט. עבור כל אחד מהעובדים שלי בחברה, ז'נט, אנדריי, מרגריי, אני מקבל את השם משפחה שלהם כמובן ואני מקבל באלו טריטוריות הם פועלים ואילו טריטוריות הם עובדים.

  17. 07:20

    שאילתא זו מורכבת משלוש טבלאות אנחנו רוצים ליצור ממנה view: קריאת view כפי שראינו בדוגמאות בשיעורים הקודמים, view and territory.

  18. 07:44

    אם אנחנו יוצרים כאן view על ידי F5 אני מקבל אינדיקציה שה-view הזה נוצר, אולם יש לי כרגע מגבלה אחת: מאחר שה-view יושב על שלוש טבלאות, ויש בו נתונים first name last name משתי טבלאות שונות, איני יכול לבצע בו פעולת insert.

  19. 08:05

    זאת אומרת, insert שכזו insert into תארכים אלא ממלא אותם אחת לאחת, טסט אחת, טסט שניים שיכנס לתוך last name ו-territory description שאותו אנחנו רוצים לראות.

  20. 08:40

    נכניס כאן את בוסטון. אני אנסה להריץ את השאילתא ואנחנו מקבלים כאן view function vm territory אותו view שאני יצרתי is not updatable מדוע אינו updatable ההודעה היא ברורה because the modification affects multiple best tables המודיפיקציה השינוי שאני מנסה לעשות כאן יושב על מספר טבלאות גם על טבלת employees וגם על טבלת

  21. 09:19

    territory description כעמודה מתוך territories וכיוון שאני לא יכול לעשות זאת אני מקבל כאן בכל פעם כשאנחנו ננסה להריץ את ה-insert הזה על ה-view, אני אקבל כאן הודעת שגיאה.

  22. 09:33

    איך אנחנו ננסה לעקוף את זה? יש לנו אפשרות שוב פעם, ליצור טריגר, לתת לו שם טריטורי, ברור וכל שבו אנחנו יכולים. on, כאן אנחנו כבר לא מציינים שאנחנו מאזינים לטבלה, אלא אנחנו מציינים שאנחנו מאזינים לפעולת ההכנסה לתוך ה-view הזה.

  23. 10:11

    wamp territory on והפעולה תהיה in state of insert בכל פעם שאני אנסה לבצע insert על ה-view הזה אני לא אקשר אלא יתבצע קוד כדלקמן אז תחילה אני אשלוף את הקוד עצמו קוד טריטוריה הרלוונטי territories

לקורס המלא: קורס SQL ו‑DBA אפליקטיבי

ההרצאה הקודמת: יצירת טריגר Trigger for / after

ההרצאה הבאה: טריגר רק על עמודה אחת

קורסים נוספים במסלול

  • קורס NoSQL - MongoDB
  • קורס SSIS
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI