
Categories שמופעל בכל עדכון, FOR UPDATE.GETDATE() ומפרק ממנו שעות ודקות בעזרת DATEPART.SUSER_NAME() מחזיר את שם המשתמש שהתחבר, ו-HOST_NAME() את שם המחשב שממנו בוצעה הפעולה.MyCategoryAudit, עם עמודות לתאריך, לשם המשתמש ולשם המחשב.Categories מפעילה את הטריגר, והתיעוד נכתב אוטומטית.inserted מכילה את השורות החדשות, ו-deleted מכילה את השורות לפני המחיקה או העדכון. הן קיימות רק בזמן הטריגר.Categories מעדכן ב-Products את כל המוצרים של הקטגוריה שנמחקה, ומסמן Discontinued = 1. בעזרת JOIN עם deleted מזהים איזו קטגוריה נמחקה.SET NOCOUNT ON בתוך הטריגר מונע הודעה על השורות שעודכנו מאחורי הקלעים, כך שהמשתמש רואה רק את מספר השורות שמחק בעצמו.Order Details מוריד מ-UnitsInStock את הכמות שנמכרה, בעזרת טבלת inserted.IF UPDATE(FirstName) בודק אם העמודה שונתה, כך שהטריגר פועל רק על שינוי בעמודה הזו.הטקסט המלא של הדקות הראשונות בהרצאה «יצירת טריגר Trigger for / after» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
שלום לכולם וברוכים הבאים לשיעור נוסף בנושא של SQL. שיעורנו היום, אנחנו נעסוק בנושא אחד המרתקים שקיימים ב-SQL, סרבר וב-SQL בכלל, וזהו נושא של טריגרים.
אנחנו כבר ניגשים למערכת New Query, טריגרים. כשאנחנו מדברים על טריגרס, לפני שאנחנו בכלל מבינים את המושג, אנחנו צריכים להבחין בין שלושה סוגים שונים של טריגר.
יש לנו DML, טריגר, לעומתו יש לנו את ה-DDL טריגר ואחרון אחרון חביב יש לנו את ה-Logon Trigger שלושת הסוגים הללו אלו שלושה סוגים נפרדים של טריגרים ובשיעורנו היום אנחנו נעסוק ב-DML טריגר מהו DML אנחנו מזכירים ידע שלמדנו אותו בשיעורים הקודמים
DML זהו Data Manipulation Language Data Manipulation Language לאמור דאטה שאני מבצע הפקודות שאני מבצע מניפולציה של הנתונים בתוך בסיס הנתונים.
בלידת ה-Manipulation Language זהו שם כולל לשלוש פעולות שאנחנו עושים Update, Insert ו-Delete. שלושת הפעולות הללו, כאשר אני מבצע אותן, אני בעצם מבצע פעולת DML, פעולה של מניפולציה של הנתונים.
מהו טריגר? טריגר זהו בעצם אוסף של פקודות אשר מתבצעות בצורה אוטומטית בעקבות שינוי של הנתונים בדאטאבס. לאמור מעתה, טריגר אני לא יכול לקרוא לו ישירות, אלא רק לאחר שביצעתי מניפולציה ביצעתי אינסרט, אבדט או דיליט, הטריגר מופעל בצורה סינכרונית,
באופן אוטומטי וללא כל יכולת שליטה שלי. אנחנו מגדירים טריגר שהוא יושב ומאזין בדאטאבס, בכל פעולת מניפולציה הוא מתעורר ומבצע את אשר הוא נדרש לעשות כן.
אנחנו מעדיפים את התרגול על פני התיאוריה ואנחנו כבר ניגשים לטריגר ראשון שאותו אנחנו נכתוב בתרגיל זה. שימו לב שטריגר כאובייקט אני צריך ליצור אותו תחילה בתוך הדאטאבס.
הטריגר שאותו אנחנו נעשה, אנחנו נעשה אותו כראשון דרך ה-GUI, דרך הממשק משתמש הגרפיקל יוזר אינטרפס שיש לפנינו כאן. בתוך ה-NodeField יש לי את רשימת האובייקטים שנמצאים תחת בסיס הנתונים, ובתוך טייבלס עבור כל אחת ואחת מן הטבלאות שנמצאות לי כאן בבסיס הנתונים, אני יכול לפתוח את הפלוס הזה ואני יכול לראות
שלצד זה שיש לי עמודות, מפתחות, קונסטרנטים, יש לי גם את העמודה המבוקשת, הלוא היא טריגרים.
בתוך טריגרים אני יכול לאבחן מהם הטריגרים שמאזינים לי לשינויים בטבלת categories עבור כל טבלה וטבלה גם אם אני נכנס לתוך employees יש לי כאן טריגרים הטריגרים משוייכים לטבלה הם אינם עומדים כstand alone מחוץ לטבלה כמו ה-views או כמו אובייקטים אחרים שאנחנו מכירים כ-store
procedure או כפונקציה אלא מדובר כאן בטריגרים באובייקטים שמשוייכים לטבלה עבור כל אחת מן הטבלאות שלי כאן יש לי טריגרס, אני יכול ליצור טריגרים, במקרה הזה אנחנו רואים שאין לנו כרגע טריגרים בתוך הדאטה בסט, אבל כשאני יוצר טריגר,
אני יוצר אותו פר טבלה. ואת הטריגר הראשון שלנו היום אנחנו ניצור דווקא על טבלת קטגוריז. בתוך טבלת קטגוריז, תחת קטגוריות, אנחנו רואים שאין לנו כרגע שום טריגר, ובמקום ליצור אותו דרך הסקריפט, אנחנו ניצור אותו דרך הקליקים.
אני מקבל כאן New Trigger ונכנס כאן לתהליך של כתיבת מציינת לי כפקודת DDL, זו פקודה שאני יוצר כאן אובייקט, היא מתחילה ב-Create, טריגר, ובשעה הזאת אני צריך להגדיר לעצמי מהו השם של אותו טריגר.
אנחנו נמחק כאן את כל התוספות ונגדיר שאנחנו יוצרים בעצם טריגר שהוא מאזין לטבלת Categories לכל שינויים, ובעצם הוא מתעד לי את השינויים.
טריגר ידפיס לנו את השעה בה יצא העדכון. Categories Update Audit זהו השם, יכולתי כמובן לבחור שם אחר לכל שם אחר משמעותי לי.
אני בחרתי שעבור טבלת קטגוריה כל פעולת Update אני רוצה לבצע לה Auditing על מנת לתעד את הפעולות. On אני צריך לציין מהי הטבלה ואנחנו מציינים שאנחנו עובדים כאן על טבלת Categories.
אנחנו יכולים לגרור את זה. בשעה שאני מציין את זה, אני צריך כאן לבחור, כבר טריגר אומר לי, האם אני עושה את זה אחרי פעולת ה-DML או במקום פעולת ה-DML. אנחנו נכתוב כאן את הביטוי לצורך הדוגמה בלבד Update for Update.
עבור פקודת Update שתתבצע על טבלת Categories, בצע בבקשה את הפעולות הבאות התחומות לך בין בגין ובין פקודת האנד כל מה שאנחנו רוצים לעשות כאן אנחנו נמחק את הערות האלה אנחנו נחזור גם לנושא הזה שוב ושוב כל שאנחנו רוצים כאן זהו להדפיס למשתמש בשלב הזה מהו הזמן שבה בוצעה
הפעולה time is שים לנו גרש 1 שהוא נכון יותר נציין זאת בעוד גדולה the time is ואנחנו משרשרים כאן בעצם מהו הזמן שבו בוצעה השינוי כדי לקבל את הזמן יש לנו כאן אפשרות לגשת לפונקציית getDate פונקציית getDate זו פונקציה שמחזירה לי אם אני עומד עליה היא מחזירה לי בעצם את התאריך וכן את השעה ואם אני רוצה לקבל ממנה רק את השעה כפי שאנחנו כאן מציינים אז
אז אני אעשה לה cast ואני אקח ממנה את date part של getDate אבל מה שאני רוצה לקחת כאן זה את השעה hh פסיק מתוך getDate אנחנו לוקחים בעצם date part של hh מתוך getDate ולכל זה אנחנו עושים casting cast as Varchar וסוגרים את זה אנחנו יכולים כמובן גם לשרשר כאן את שעה שלי אם הבאנו את השעה אז אנחנו גם נשרשר את הדקות ומה שאנחנו כאן נכתוב זה קאסט
הפעם שוב פעם ניקח את הדייט פארט כפי שראינו בשיעורים קודמים אבל לא את השעה אנחנו רוצים אלא את הדקות מ.איי גט דייט אנחנו סוגרים את הפונקציה של הדייט פארט וגם כאן אנחנו עושים לזה קאסט אס ורצ'אר וניתן לסגור את הנקודה שלנו הקאסט עצמו נרשום אותו נכון אנחנו כבר מקבלים אינדיקציה שהתוכנית שלנו הסתיימה בצורה נכונה.
בואו נעביר רק את ה-end על מנת לסגור את ה-begin שלי, ובזה הרגע יצרנו לנו אובייקט ראשון כרגע בתוכנית.
האובייקט הוא מסוג Trigger, זהו אובייקט DDL ולכן יצרתי אותו על ידי פקודת קריאט. זהו שם האובייקט Categories Update Audit.
אני עבור פקודת DML של Update כפי שציינתי בפרוטוטייפ של הטריגר בשם שלו אני עבור כל פקודה של Update מבצע פרינט הודעה מתי הודפס יתרה מכך אנחנו גם בהמשך נוכל להוסיף פרמטרים נוספים שאני רוצה לתעד כגון שם המשתמש המחשב שלו אבל בואו נראה כיצד הדברים עובדים אני מסמן לעצמי את השאילתה פקודת היצירה DDL ומקבל
אינדיקציה של קומאד קומפליטד סקספולי רוצה לומר יש לי כרגע טריגר חדש שיושב לי בטבלה בואו נראה אותו אנחנו עומדים על הדאטאבס רפרש שוב פעם נכנסים לתוך טייבלס תחת קטגוריז טריגרס ואנחנו מגלים
סגור את הפקודה שבה אנחנו יצרנו את זה אין לנו כבר צורך לשמור אותה ושימו לב שכשאני עומד על זה דאבל קליק אני מקבל כבר את הפקודה עצמה של הטריגר הוא אומר לי מהו השם שלה הוא מציין לי מה הפקודה עושה כפי שאנחנו רשמנו את זה כאן, הטריגר הזה נוסף תחת טבלת קטגוריס.
איך אני משתמש בטריגר? אז כפי שאמרנו, לטריגרים אנחנו לא קוראים, טריגרים אנחנו לא מבצעים להם שום אקזקיוט, אנחנו פשוט צריכים לבצע את הפעולה שאליה הם מאזינים, וזוהי פעולת Update על טבלת קטגוריס.
בואו ננסה לעשות את זה. בכל פעם שהמשתמשים שלי יריצו פקודת Update, קטגוריס, לא משנה איזה עמודה אנחנו מאזינים לכל האפדייטים בטבלת Categories, ובכל עמודה שאנחנו נעשה לה שינוי, מיד יתעורר לנו ה-Triggers.
הבה ונשנה. Category Names הוא עמודה. נעשה זאת עבור Category Names שווה ל-Condiments, וכל שאנחנו רוצים לשנות כאן תחת השיר Condiments נרשום, ויש לנו מספיק מקומות קונדימנס זהו 15 תאים אז אנחנו נוסיף כאן תא אחד בלבד כאינדיקציה a או שנוסיף את test שימו לב מה
שאנחנו עושים בחרנו את קטגורי name קונדימנס אנחנו מבצעים פעולת update תמימה לכל דבר ועניין כפי שראינו בשיעור של dml פקודות data manipulation language אני על טבלת קטגוריז משנה את הקטגורי name וכעת אני מריץ אותה שימו לב מה קורה אנחנו מקבלים f5 one rose affected אבל לצד זה שבוצעה הפקודה הזאת במקביל הטריגר שלי התעורר והוא גם הדפיס לי למסך ב-time is 12.35 הוא לוקח
לנו את השעה ממערכת ההפעלה של ההוסטים הוסט בו אני יושב של המחשב עצמו של הטרמינל שבו אני נמצא 12.38 זוהי השעה, ברגע שביצעתי פקודת update אוטומטית קיבלתי את הפקודות הנמצאות בתוך הטריגר.
כעת חברים וחברות ננסה לשוב לטריגר שלנו ולהוסיף בו מידע נוסף שאותו אנחנו רוצים לתעד. הבה וניגש לטריגר, הטריגר עצמו כבר קיים וכל שאנחנו רוצים זה בעצם לבצע בו שינויים.
שינויים בפקודות באובייקטים שהם DDL אנחנו בעצם על ידי פקודת אלטר דאבל קליק אני מקבל את הקוד יצירה של הטריגר כן כפי שתיעדתי את הזמן אנחנו רוצים להוסיף כאן מידע נוסף אותו אני יכול לשלוף אני לא רק רוצה את הזמן שעה ודקות אנחנו רוצים גם את שם המשתמש שם המשתמש אנחנו מקבלים
אותו על ידי s-username s-username כפי שאנחנו יכולים לראות זוהי פונקציה ברגע שאני עומד עליה פונקציה שהיא בעצם בילדין של הדאטאבייס של SQL Server והיא מעניקה לי את שם המשתמש אשר ביצע את השינוי הזה.
בואו ניתן לזה איזושהי קידומת username.sogrim + אנחנו מוסיפים את שם המשתמש ואנחנו ברשותכם גם נטרח ונוסיף דבר נוסף מאיזה מחשב הוא עשה את זה.
כדי לעשות זאת אנחנו צריכים לגשת לפונקציה אחרת שנקראת host name, בואו נדפיס host name, הפונקציה היא host == name == ומבחינתנו יש לנו גם את הזמן, יש לנו את ה-user name שם המשתמש ויש לנו בעצם את ה-host שם המחשב, נשים לב שזהו ה-user name אשר בעצם מתחבר לנו ל-database.
אנחנו בפקודת אלטר ולכן אנחנו מבצעים אקזקיוט שינוי והפקודה נותנת לי אינדיקציה Completed Successfully. יצרנו את הטריגר ואנחנו נרחיב אותו שוב לא רק למידע הזה אלא אנחנו נרחיב אותו לא רק לפעולת Update אלא עבור כל פעולות ה-DML.
איך אני עושה את זה? אני מפרט insert, seek, delete ו-update כמובן נשאר עבור כל אחת מפעולות המניפולציה של ה-DML יתעורר הטריגר ויבצע זאת.
אנחנו מריצים זאת, עומדים כאן מריצים ומקבלים Completed Successfully. טריגר עוד כאן נכון, כל שנותר לנו כרגע לעשות זה פשוט לבדוק את זה. שימו לב שכל קווירי מתוך טבלת Categories כמובן שאין בו כדי לשנות את הנתונים וממילא הטריגר לא מתעורר.
עשיתי כאן כמה שינויים של בתוך הטבלה, בואו ננסה למחוק להוסיף בעצם קטגוריה חדשה. איך אנחנו עושים את זה? בואו ניגש כאן, Categories. אני רוצה להוסיף, שימו לב שיש לי סקריפטים אוטומטיים לכל פעולת מול הדאטאבס, הן פעולת DDL של יצירת האובייקט והן פעולת query והן פעולת DML. אבל אנחנו נטרח ונכתוב זאת Insert
into Categories לתוך טבלת Categories. אנחנו רוצים להכניס את הערכים הבאים values, מהם העמודות שאותן אנחנו רוצים למלא, אז אנחנו נמלא את העמודות שאנחנו מחויבים אליהן לצורך התרגול בלבד, category name ו-description, מהם הvalues שאנחנו מכניסים להם בהתאמה, לתוך category name אנחנו נכניס קטגוריה חדשה
ואנחנו נקרא לה קטגוריה המדמה לי לצורך הדוגמה כמוצרי חלב, קטגוריה מילקס ואנחנו ניתן לה גם כמובן תיאור דיירי פרודקטס.
אנחנו מבצעים כאן insert נוסף של קטגוריה, כולל השם וכולל התיאור. כל שנותר לנו זה לבצע execute של הפקודה. F5 אני מריץ, ואני מקבל כאן אינדיקציה של one-hours affected, ובנוסף לזה אני מקבל ש-time is מקבל את השעה.
מהו ה-username שהתחבר וביצע את זה, ומהו ה-host, שם המחשב אשר ממנו בוצע השינוי. כל המידע הזה, זהו מידע שבעצם כבר נותן לנו אינדיקציה ראשונה.
מהו תפקידו של טריגר? וכבר אנחנו יכולים להבין שטריגר במהותו יכול לתת לי פעולות של אודיטינג, פעולות של בדיקה ותחקור של השינויים אשר נעשו בתוך הדאטאבס.
יש לי אפשרות לתעד את השינויים האלה. אנחנו הראינו כיצד זה נכנס כאן בתוך הפלט למשתמש, אבל באותה מידה אנחנו גם יכולים לבצע את זה לתוך אינסרט לטבלה מתאימה.
כדי לבצע זאת אנחנו ניצור לעצמנו טבלת אודיט נקרא לה. מהי קטגורי אודיט? Create table. איך אנחנו ניצור את הטבלה? אנחנו רוצים להכניס בה כמובן זמן ולכן את העמודה הראשונה.
אנחנו נקרא לה Date. 1 היא תהיה מסוג Daytime ואילו לעמודה השנייה אנחנו רוצים להכניס את השם. כי הוא השם אשר ביצע את השינוי, כאן אנחנו נקרא לה e-name והיא תהיה מסוג של וורצ'אר 50. העמודה האחרונה שבה אנחנו מסיימים בעצם היא תכיל לי את ה-hostname ואף היא תהיה מסוג וורצ'אר של 50. סגרנו
ובואו נריץ על מנת לקבל את הטבלה. קיבלנו את הטבלה completed successfully, הטבלה פחות מעניינת אותנו. מה שמעניין אותנו כרגע זה כיצד לגשת מתוך הטריגר ולא לבצע הדפסה של השינויים כפי שעשינו על ידי פקודת פרינט, אלא להכניס את השינויים לתוך טבלת My Category
Trigger. הטריגר שלנו, שעליו אנחנו עובדים, נמצא תחת Categories כאמור. דאבל קליק אני מקבל את הקוד שלו. כל שאנחנו רוצים לבצע זה בעצם Insert into שם הטבלה, ומכאן אנחנו כבר צריכים להכניס את הנתונים.
ראשון יעלה ויבוא Get Date, התאריך בעצם שאותו אנחנו רוצים לתעד. מתי בוצעו השינויים. אנחנו רוצים גם לתעד את היוזרנם S-U-ser name פותחים סוגרים סוגריים כפונקציה שאינה מקבלת פרמטרים ופרמטר אחרון שם המחשב שאותו אנחנו שולחים בדיוק כפי שכתבנו hostname וסוגרים שורות אלו אינן רלוונטיות עוד עבור הטריגר ולכן אנחנו נכניס אותם ברשותכם להערה מה
שאנחנו עשינו כאן בעצם זה יעשינו insert into mycategories audits ומה שחסר לנו כאן זה לציין values מהם הערכים הרלוונטיים שייכנסו בהתאמה אחת לאחת לתוך טבלת mycategories audits אם היום אני אבוא לתחקר את הטבלה הזאת נפתח query חדש ולעשות עליה query לדעת מה יש בה אז כמובן בהיותה טבלה ריקה שלא הכנסנו
בה נתונים אנחנו לא נמצא בה שום מידע אבל אם נחזור ונשמור את הטריגר ונקבל אינדיקציה של Completed Successfully ונחזור כרגע לבצע פעולת DML כל פעולה של Update, Insert או Delete על טבלת Categories אנחנו מיד נקבל שורה בתוך הטבלת האודיט שלנו. איך זה מתבצע?
בואו ננסה לעשות זאת. הפעם אנחנו כן נשתמש בתוך ה-Graphical User Interface, נשתמש כאן בתוך הקוד האוטומטי. קליקים אני Script Table As ואנחנו רוצים לבצע אחת מן הפעולות הללו.
בואו ננסה לעשות delete, אני פותח, שופך את זה ל-New Query. אני יודע שבעצם מתוך קטגוריז יצרנו קטגוריה חדשה כדי לאבחן אכן שעשינו זאת, אם אני אתחקר את הטבלה ואני אעשה ממנה סלקט, אנחנו נראה שבתחתית הרשימה יש לנו קטגוריה מספר 10, N במוצרים,
רק הכנסתי אותה, ואת הקטגוריה הזאת. תשע ועשר אנחנו מעוניינים למחוק. אנחנו נמחק זאת על ידי פקודת delete. delete from categories where קטגורי ID שווה או אין במידה ואנחנו רוצים למחוק כאן שניים ואנחנו נציין לו תשע פסיק עשר.
אנחנו מריצים כאן פקודת delete תמימה שהיא רצה על טבלת קטגורי בלבד אבל זה לא קורה ככה בדיוק אלא כבר אני מקבל כאן אינדיקציה מהמשתמש. ומחקת אמנם שתי שורות 2 rows Affected זה מה שקרה אבל לפני שזה קרה התעורר כאן טריג ומה הוא עשה הוא הכניס שורה.
בואו נבחן זאת Select כוכבית From טבלת האורגית שלנו F5 ואנחנו מגלים שכל פעם שאחד המשתמשים שלי יעשו שינוי ימחקו יוסיפו או יעדכנו יש לי טבלה שיושבת על טבלת קטגוריז ומאזינה לה.
טבלת מהי קטגורי אודית זוהי טבלה שמקבלת את הנתונים מתוך הטריגר ומאזינה לי לשינויים שנעשו. אנחנו לא צריכים את זה, אבל דבר ראשון שאנחנו כבר יכולים לראות כאן, שהטריגר יכול לתת לי פעולות של OD, פעולות בעצם של תיעוד הפעולות שמשנות את בסיס הנתונים, פעולות שהמשתמשים שלי עשו.
חברים וחברות, שימוש נוסף שאנחנו עושים בטריגרים הוא הנושא של Data Integrity. דאטה אינטגריטי משמעותו אמינות של הנתונים, אמינות של הנתונים שלי בתוך דאטאבס.
אמנם על מנת לשמור על אמינות נתונים אנחנו בדרך כלל נעדיף להשתמש בקונסטרנטים כגון Foreign Key ו-Check Constraint. אמינות של הנתונים משמעותה ששינוי בטבלה אחת משפיע ומקושר לשינויים בטבלאות אחרות, ולכן אנחנו נעדיף להשתמש ב-Foreign Key שמוודא לי קשר בין טבלאות, נעדיף להשתמש ב-Check Constraint, אבל כעת אנחנו נראה כיצד
אנחנו משתמשים בטריגרים על מנת לשפר את האמינות של הנתונים שלי בתוך הדאטאבס. בואו נבחן את טבלת קטגוריז.
טבלת קטגוריז מראה לי בעצם שורה של קטגוריות, השמות שלהם בתוך הדאטאבס. מנגד, עבור כל קטגוריה בטבלת פרודקטס, אם אנחנו ניכנס, אני אראה, בואו ננסה להיכנס לזה דרך Edit, Top Rows, אנחנו נראה שעבור כל הנתונים המוצרים שלי בטבלת פרודקטס,
יש לי קטגוריה רלוונטית, הם משויכים לקטגוריה מסוימת, ועבור כל מוצר ומוצר יש לי עמודה המציינת האם ניתן להמשיך במכירה שלו או שלא ניתן, צריך לעצור את המכירה.
ברגע שזה אחד, אז לא ניתן למכור את המוצר, המוצר הוא כבר לא קיים במדפי החברה והוא יצא מפס ייצור. מה אני רוצה כרגע לעשות? אני רוצה למחוק קטגוריה מסוימת, והשאיפה שלי היא שברגע שאני מוחק את אותה קטגוריה, לבצע עדכון בטבלת פרודקטס עבור כל המוצרים של אותה קטגוריה לדיסקונטיניוט שווה 1. שימו
לב שאם אני אנסה כבר כרגע למחוק קטגוריה מתוך טבלת קטגוריז, אני אכשל, והכישלון נוצר מכיוון שיש לי כרגע פורנד קי, אשר מוודא דאטה אינטגריטי, מוודא לי אמינות של הנתונים.
פורנד קי נמצא על טבלת פרודקטס, כפי שאנחנו יכולים לראות, FK Products Categories, הוא מוודא מכיוון שעבור קטגוריה מספר 8 יש לי כרגע מוצרים על קטגוריה מספר 8 יש לי מוצרים כגון מוצר שקודו מספר 18 הוא שייך לקטגוריה מספר 8 ומכיוון שיש לי מוצרים באותה קטגוריה אני לא יכול למחוק אותה.
קטגורי זו טבלת האבא כביכול שבה מצוינים הקטגוריות ומכיוון שיש מוצרים תחת אותה קטגוריה אני לא יכול למחוק אותה. על מנת לאפשר לנו כן למחוק את הקטגוריה הזאת, אני ברשותכם אגש לאותו Foreign Key, לאותו Constraint, אני לא אמחק אותו, אני פשוט אעשה אותו שהוא יהיה לא ולידי.
איך אנחנו עושים את זה? דברים שראינו אותם בשיעור של קונסטרנטים, על Terrible Products, לתוך טבלת Products אני אומר לו No check של קונסטרנט, כאן אני יכול להגיד לו את הפקודה All, כל הקונסטרנטים תחת טבלת פרודקט הם כרגע יהיו במצב של no check כלומר הם כרגע disabled או שיש לי אפשרות פשוט לקחת ולא להגיד את
זה לכל הקונסטרנטים אלא את הקונסטרנט עצמו לציין אותו. אלטר טייבל פרודקט no check קונסטרנט F5. כעת אם אני אנסה למחוק את הקטגוריה הזאת F5 הקטגוריה אכן נמחקה.
קטגוריה של קטגוריה ID 8 נמחקה לנו מהטבלה לבלתי שוב. אנחנו את התרגיל שלנו נעשה עבור קטגוריות נוספות. הבה ונשלוף שוב פעם את הנתונים ובואו נבחר לצורך הדוגמה שאני רוצה למחוק את קטגוריה מספר 6. בוא נראה מה