טריגר המחולל טריגרים

יום רביעי, יוני 20, 2012

נניח שיש לנו טבלה בשם T_Try001 הכוללת רשימה שלא אמורה להשתנות בדרך כלל (הגדרות, רשימת סניפים, רשימת תפקידים..), אנחנו מעוניינים לדעת מתי שינו אותה ולשם כך יוצרים טריגר המעדכן טבלת לוג בשם T_Log. פעם כתבתי על זה דוגמה מקיפה הכוללת את כל המידע שאנו עשויים להזדקק לו, אלא שכעת אצטמצם לתיעוד מינימלי ומי שירצה יוכל להרחיב את טבלת הלוג והטריגר: Use tempdb; go   Create Table T_Try001(I Int);   Create Table T_Log(ID Int...
תגובה אחת

השימוש בטריגרים

יום שלישי, פברואר 14, 2012

טריגר על פעולות DML בטבלה הוא כלי מוכר יחסית, אך לא כל האופציות מוכרות; ואולי מתבלבלים לעיתים בינו לבין טריגרים אחרים. הפוסט הזה עוסק בטריגרים על טבלאות שמופעלים בעקבות ביצוע פעולות Delete / Update / Insert בטבלה עליה הם הוגדרו. הטריגרים אינם מופעלים בעת ביצוע פקודת Select או Truncate, שינוי סכימה של טבלה, או כל שינוי שהוא באובייקטים של המערכת; ולכל אלו יש פתרונות אחרים. כדי לפשט את הדוגמאות- אשתמש בכל פעם בטבלה אחת בלבד, והטריגרים יפעילו פקודות Print או Select כדי להמחיש את הפעולה שלהם. במציאות הטריגרים אמורים להפעיל בדרך כלל פקודות Insert לטבלת לוג...

כיצד לעיין בקוד פרוצדורה

יום שלישי, ספטמבר 21, 2010

באיזשהו מקום במערכת משתמשים בפרוצדורה (או שמא בפונקציה?) MyCode ואנחנו מעוניינים לדעת מה הקוד שלה, כדי להבין מה היא עושה וכיצד.. לרוב ניגש לשוליים השמאליים של ה-SSMS, נחפש את השרת עליו אנחנו עובדים, נאתר את הדטבייס הרלוונטי, נפתח את Programmability, ניגש ל-Stored Procedures או ל-Functions (במקרה השני- נצטרך להימלך בדעתנו אם מדובר בפונקציית טבלה או בפונקציית סקלאר), ואז נמצא ברשימת האובייקטים את מבוקשנו.. רגע- לא סיימנו: קליק ימני, ו-Midify.. אפשר לקצר כל זאת כך: Exec sp_HelpText MyCode; Go והקוד יופיע ב-Grid למטה. אם נרצה לערוך או לעיין בו בעורך הטקסט- נסמן ונעתיק אותו למקום המתאים. על ה-Exec, ה-;, וה-Go אפשר לוותר: אני מציין אותם רק בשביל...

פקודת Truncate Table

יום שני, יולי 5, 2010

במערכת של אוראקל נדרשתי להפעיל פרוצדורה גנרית על טבלה שבניתי (הכוונה שהפרוצדורה מקבלת את שם הטבלה כפרמטר וכך אותה פרוצדורה יכולה לטפל בכל הטבלאות), אולם היא נכשלה מכיוון שלעמודת התאריך לא נתתי את השם הסטנדרטי שהפרוצדורה אמורה למצוא אלא את השם שציין הלקוח באפיון. לשנות את שם העמודה כעת עלול להוביל לתקלות ב-ERP שמעביר אליה וממנה נתונים ואולי גם בדוחות, וכדי לחסוך מעצמי את כל כאב הראש חשבתי להתחכם, ליצור View על הטבלה שבו השמות יהיו כנדרש, ולהפעיל את הפרוצדורה עליו: ניתן לבצע פקודות Select, Delete, Update, Insert על View כאשר הוא מוגדר כ-Select על טבלה ללא סיבוכים כמו Group...

האח הגדול עינו פקוחה (6)- זיהוי עצמי בזמן ריצה

יום רביעי, יוני 9, 2010

לפרוצדורה MyProc שרצה בדטבייס MyDB בשרת MyServer אין בעייה "לדעת" מי והיכן היא, אלא שלעיתים אנו מוסיפים לאובייקטים תכנותיים כמו פרוצדורות או טריגרים או ג'ובים שגרות שגיאה סטנדרטיות או דיווחים סטנדרטיים  שכוללים כתיבה לטבלת Log, ואנחנו מחפשים דרך להימנע מהצורך לשנות בכל אובייקט את תוכן הפקודה (פקודה כזו בוודאי תכלול את שם הפרוצדורה בתוכה היא רצה). חשוב להדגיש כבר כאן שזה יהיה רעיון לא מוצלח אם מדובר באובייקטים פשוטים שרצים מספר רב מאוד של פעמים, ומחיר עדכון טבלת הלוג עלול ליצור עומס בלתי נסבל (לגבי מעקב שגיאות- נניח באופן אופטימי ששגיאות לא קורות בכל יום :-)). ...

האח הגדול עינו פקוחה (5) – מי שינה את הנתונים בטבלה?

יום חמישי, מאי 13, 2010

בחברה קמעונאית בה עבדתי בעבר היו כל מיני מבצעים לקידום מכירות, על פי התוצאות היו מתגמלים את מנהלי האזורים וסוכני המכירות, והיו כל מיני הגדרות מי שייך למה ומי זכאי למה לטובת הנ"ל. אינני זוכר את הפרטים בדיוק, אבל באופן כללי הקמתי טבלה עם נתונים הקשורים למערכת התגמולים, כעבור מספר חודשים באו אלי בטענות שההגדרות אינן מתאימות למה שנקבע מלכתחילה, כולם – כולל אני – ניערו חוצנם וטענו שלא הם שינו את הנתונים האלו, ועכשיו לך חפש מי ומה ומתי.. נניח שיש לנו טבלת עובדים צנועה עם שמות העובדים ומשכורותיהם (אפשר כמובן להרחיב את הטבלה בהתאם לדוגמה): USE tempdb; GO If object_id( 'T_Ovdim') Is Not Null Drop Table T_Ovdim; Go Create...