הוספת שורות לשתי טבלאות בו זמנית

יום חמישי, דצמבר 1, 2016

פעם כתבתי פוסט על הנושא, בעיקר בתור אתגר; בשם חסכו ואמצו (2).באופן כללי, ניתן לשלוף את השורות שהשתנו (במקרה זה – התווספו) על ידי האופרטור Output,ואם קצת מתחכמים – להפנות את הפלט של ה-Output לטבלה שניה.בערך כך: If Object_ID('B') Is Not Null Drop Table B; If Object_ID('A') Is Not Null Drop Table A; Create Table A(ID Int Identity Primary Key, ...
אין תגובות

סקריפט הפונה למספר דטבייסים

יום שני, אפריל 20, 2015

לכאורה זו אינה משימה מסובכת במיוחד: בסקריפט הפונה למספר דטבייסים ניתן להוסיף למשפטי ה-SQL את שם הדטבייס (נניח-.. Update MyDB..MyTbl Set).כל זה לכאורה, כי יש מספר בעייות עם זה: סקריפטים רגישים (למשל- בהעברה מסביבת פיתוח לסביבה יצורית) אמורים להיות כתובים כך שאם יש תקלה ניתן להריצם שוב, והם ישלימו את החסר מבלי לפגוע במה שאינו. למשל- לא ינסו ליצור מחדש אובייקט שכבר נוצר, או להוסיף לטבלה שורות שכבר התווספו. לא ניתן לבצע פקודות Drop & Create לאובייקטים בדטבייס אחר מהנוכחי. ניתן רק בזה בו נמצאים. כלומר- לא ניתן להריץ פקודות בסגנון של ..Create Proc AnotherDB..P_MyProc As. אם כך,...
אין תגובות

בדיקת תקינות synonyms כתרגיל טכני

יום חמישי, ינואר 1, 2015

תוך כדי עבודה אנחנו לומדים טריק פה ופטנט שם, התחכמות כאן ותעלול שם; ויש סיכוי טוב שביום מן הימים נעשה שימוש בהם בבעיות ובמקומות אחרים, ואולי גם נקצור תשואות חן על השימוש היצירתי.הפוסט שלהלן אינו עוסק באיזו טכנולוגיה חדשנית, אולן נעשה בה שימוש בכל מיני תחבולות שלחלקו הוקדשו פוסטים בעבר, ושווה לרענן את הזכרון. סיפור המעשה הוא כדלקמן: יש לנו synonyms באחד הדטבייסים, ויש לבדוק שאלו שפונים לשרתים אחרים דרך Linked Servers – תקינים.Synonyms הם קיצורי דרך לאובייקטים: טבלאות או פרוצדורות וכו’, בדטבייס שלנו או באחר, או אפילו בשרת נפרד. כך ניתן להגדיר ש-Kuku1 הוא synonym לטבלה MyTbl בדטבייס...
אין תגובות

כיצד מבצעים Select מטבלה דרך Linked Server?

יום רביעי, נובמבר 26, 2014

התשובה לשאלה בכותרת ברורה לכל טירון: Select * From MyLinkedServer.MyDB.dbo.MyTable (וכל הוואריאציות המתבקשות).זה אמנם נכון כשהכל תקין, אך מה קורה כשיש בעייה והשרת אינו מחובר?אפשרות אחת היא לבדוק אם יש חיבור בעזרת פרוצדורה מפוסט קודם. הפרוצדורה ההיא עובדת, אך עדיין יש בעייה ביצירת פרוצדורה שפונה ל-Linked Server שאינו פעיל; כפי שנראה בהמשך.ננסה להסתדר בלי הפרוצדורה הנ”ל, וראשית חוכמה ניצור Linked Server הפונה לשרת kukuku שלא היה ולא נברא (כולל איפשור RPC כדי שיהיה ניתן להפעיל פרוצדורות בהמשך): Exec master.dbo.sp_addlinkedserver @server = N'LSnot', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'Kukuku';Exec master.dbo.sp_serveroption @server=N'LSnot', @optname=N'rpc', @optvalue=N'true';Exec master.dbo.sp_serveroption @server=N'LSnot', @optname=N'rpc out', @optvalue=N'true';Go וכעת פרוצדורה ששולפת ערך דרכו,...
אין תגובות

דוח הרשאות חריגות של משתמשים

יום חמישי, יולי 31, 2014

פרטים על ההרשאות ניתן לקבל על ידי קליקים ימניים ב-SSMS, והם גם נשמרים בטבלאות המערכת, רק שבמקרה זה צריך לפעמים קצת להתאמץ כדי לקבל את התוצאה המבוקשת.הבעייה שניצבנו בפניה מוכרת לי ממקומות עבודה קודמים: בודקים ומגלים שלמשתמש (Login) פלוני יש הרשאות מסויימות ברמת השרת ו\או ברמת הדטבייס (בכל דטבייס הרשאות אחרות). לכאורה זה שנצפה למצוא ב-Security; אלא שלא כך עובדים: הרשאות יש לתת לקבוצות ולא למשתמשים ספציפיים.למשל- יוסי מהשיווק זקוק להרשאות כאלה ואחרות כדי לתחקר את הנתונים המעניינים אותו. במקום לתת לו אישית את ההרשאות המתאימות ראוי שניצור קבוצה של אנליסטים או אנשי שיווק, נשייך אותו אליה, וניתן לקבוצה...
אין תגובות

מנגנון לתיקון טקסטים

יום רביעי, מאי 28, 2014

הפוסט הזה מתפרסם בעקבות שאלה שהתפרסמה בפורום בספרדית:נתונה טבלת כתובות datos#,יש טבלה נוספת עם מילים שגויות incorrecto#,וטבלה עם חלופות תקינות correcto#;ויש להחליף בטבלת הכתובות את המילים השגויות בתקינות.מכיוון שבין שתי הטבלאות האחרונות יש יחס של 1:1 אני הייתי שומר אותן בטבלה אחת בת שתי עמודות: מילה שגויה, חלופה תקינה; וחוסך אי הבנות.בנוסף- זיהוי מילים בטקסט (להבדיל מתתי מחרוזות) זה אתגר בפני עצמו שהרחבתי לגביו בעבר, וכאן נניח שכל מופע של תת מחרוזת שגויה יש להחליף בחלופה תקינה מבלי לברר אם מדובר במילה שלמה או לא. כיצד נעשה זאת? ניתן ליצור Join בין טבלת הכתובות לשתי הטבלאות האחרות בה ליד...
תגיות: , ,
אין תגובות

הרשאות חסר ויתר בהרצת קוד דינמי

יום חמישי, נובמבר 14, 2013

הפוסט הזה הוא בהמשך לקודם שסיכם את ההרצאה ב-ISUG. בין היתר הוצע שם פתרון לבעיית ההרשאות בפרוצדורות הכוללות קוד דינמי (שאינו מקבל בירושה את ההרשאה לפרוצדורה) בעזרת Execute As Owner או כל הרשאה אחרת שתאפשר את הקוד הדינמי. כמקובל בעולמנו – לפתרון הזה יש חסרונות משלו, למשל – המשתמש מאבד את זהותו וכעת המערכת תזהה אותו בתור dbo או מישהו אחר, וזה יאפשר לו להגיע למידע שהוא לא אמור היה להגיע אליו. דוגמה שתבהיר את הבעייה המקורית, את הפתרון, את הבעייה בפתרון, ואת הפתרון לבעייה בפתרון.. נתחיל מליצור Login ו-User מעוטי הרשאות להמחשה: --Mixed mode!Use tempdb;Go If Exists (Select...
אין תגובות

SQL דינאמי–הרצאה במפגש ISUG

יום שלישי, נובמבר 5, 2013

אצל רבים המונח SQL דינאמי מתקשר אוטומטית עם SQL Injection וכיצד ניתן לנצל זאת כדי "לדחוף" כל מיני תנאים לא צפויים שיאפשרו לשלוף מידע חסוי ואף לשנות מידע קיים. האזהרות כבודן במקומם, אך ל-SQL דינאמי יש יתרונות ושימושים רבים שכדאי להכיר, ולבעיות האבטחה יש פתרונות. נכון- גם לפתרונות קיימים מעקפים ומחבל זדוני ימצא תמיד פירצה דרכה ניתן להזיק, וזה נכון לא רק ל-SQL דינאמי אלא לכל מערכת שהיא. עד כאן ההתנצלויות לגבי "אבל יש סכנה של SQL Injection.." ומכאן למלאכה. נתחיל מ"איך" ולא מ"למה": יש שתי פונקציות עיקריות שמאפשרות לנו להריץ...
אין תגובות

SQL דינאמי–הרצאה במפגש ISUG, נובמבר 2013

אצל רבים המונח SQL דינאמי מתקשר אוטומטית עם SQL Injection וכיצד ניתן לנצל זאת כדי "לדחוף" כל מיני תנאים לא צפויים שיאפשרו לשלוף מידע חסוי ואף לשנות מידע קיים. האזהרות כבודן במקומם, אך ל-SQL דינאמי יש יתרונות ושימושים רבים שכדאי להכיר, ולבעיות האבטחה יש פתרונות. נכון- גם לפתרונות קיימים מעקפים ומחבל זדוני ימצא תמיד פירצה דרכה ניתן להזיק, וזה נכון לא רק ל-SQL דינאמי אלא לכל מערכת שהיא. עד כאן ההתנצלויות לגבי "אבל יש סכנה של SQL Injection.." ומכאן למלאכה. נתחיל מ"איך" ולא מ"למה": יש שתי פונקציות עיקריות שמאפשרות לנו להריץ...
2 תגובות

הרצת פקודות דינמיות: Exec מול SP_ExecuteSQL

יום רביעי, אוקטובר 10, 2012

כשמריצים SQL דינמי ניתן לעשות שימוש באחת משתי פרוצדורות המערכת הנ"ל. ה-DBA-ים הוותיקים בוודאי זוכרים במעורפל משהו על כך ש-SP_ExecuteSQL עדיפה מפני שהיא יכולה למחזר Execution Plans, אך מה זה בדיוק אומר ומי מבין השתיים עדיפה ומתי? נפתח ברשימת המצרכים- טבלה עליה נוכל להריץ את הקודים הדינמיים: Use tempdb; Go   If Object_ID('T_Messages','U') Is Not Null Drop Table T_Messages; Go   Select * Into T_Messages From sys.messages; ...
תגובה אחת