תיכנות מקבילי בעזרת Start

יום חמישי, מרץ 12, 2015

פירסמתי בעבר מספר פוסטים לגבי השימוש ב-Service Broker להרצה במקביל של מספר תהליכים, והנה עוד אופציה – לשיקולכם. פקודת Start ב-Command Line של Windows מאפשרת להריץ מספר פקודות במקביל, כלומר- אם ניצור קובץ batch ובו מספר פקודות כשלפני כל אחת Start; המערכת תפעיל כל אחת מהן בחלון/Session נפרד, והן ירוצו במקביל. כל זה קשור למערכת ההפעלה ולא ל-SQL Server, אך ניתן להריץ בצורה זו גם פקודות TSQL בעזרת SQLCmd ולהינות מפתרון מעניין שלא כרוך ביצירת אובייקטים וקודים מסובכים יחסית. ניצור קודם כל טבלת לוג כדי לעקוב אחר הפקודות השונות שירוצו במקביל: Create Table Try(ID Int Identity Primary Key Clustered, ...
אין תגובות

מה כלול בטרנזקציה?

יום רביעי, יולי 18, 2012

נתחיל מתעלול בלתי שימושי בעליל- ציוץ מתוך ה-SSMS (אינני מתכוון לטוויטר אלא להשמעת קול דרך הרמקול): (הרצתי את זה בהצלחה במחשב בו מותקן מקומית SQL Server R2 עם מערכת הפעלה XP וכשניסיתי להריץ מול שרת מרוחק- החלון נתקע והייתי צריך לסגור אותו) Exec master..XP_CmdShell 'C:\WINDOWS\ServicePackFiles\i386\sndrec32 /play /close "C:\Windows\Media\Notify.wav"'; מי שזה לא עובד לו- או שהרמקול מכובה, או ששני הקבצים נמצאים במקום אחר בשל הבדלים בגרסאות מערכת ההפעלה, או שזה נתקע לו כי לא מדובר בהתקנה מקומית של השרת אלא בעמדה מרוחקת, או שהוא לא קינפג את XP_CmdShell לשימוש וכו'.. ...
אין תגובות

שירשור סקריפטים

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

הנה טיפ שימושי: מדובר בפקודת Dos ותיקה ומוכרת, שהפעם נעשה בה שימוש לטובת DBA-ים של SQL Server. בתהליך הפיתוח אנחנו יוצרים אובייקטים (טבלאות, פרוצדורות..), מכניסים ערכים לטבלאות הגדרות וניהול וכו'. כל פעולה כזו נשמרת בסקריפט נפרד, וכשמעלים גרסה משרת הפיתוח לשרת הבדיקות – יוצרים מהסקריפטים הרלוונטיים סקריפט אחד ארוך שכולל את כולם לפי סדר הגיוני. נניח שהסקריפט הראשון כלל יצירת טבלה ונשמר בתור C:\Tmp\A.sql Use tempdb; Go Create Table MyTbl(Taarih DateTime); Go הסקריפט השני כלל הוספת שורה לטבלה הנ"ל ונשמר בתור C:\Tmp\B.sql Use tempdb; Go Insert MyTbl Select GetDate(); Go והסקריפט השלישי כלל הוספת עמודת Identity לטבלה ונשמר בתור C:\Tmp\C.sql Use tempdb; Go Alter Table MyTbl Add ID Int Identity Primary Key; Go כעת בעזרת פקודת...
אין תגובות

שירשור ערכים מטבלה

יום שני, אוגוסט 2, 2010

נפתח בחידה בעל פה: מה יהיה הפלט של הסקריפט הקצר הבא? Declare @S Varchar(Max); Select @S=name From sys.sysobjects; Print @S; נו טוב- הרוב בוודאי ממשיכים הלאה לראות מה התשובה בלי לנסות לחשוב, ומבין מעט הצדיקים שעוצרים לרגע ומנסים את כוחם – חלק אולי כבר יודעים את התשובה, חלק מבינים שיש כאן מלכודת ולא שאלת תם, ואולי יש צדיק אחד שנופל בפח הלא מוצלח.. לעצם העניין – אתם אמורים לטעות ולטעון שהתוכנית תיכשל מכיוון שלתוך משתנה ניתן להכניס ערך אחד ולא עמודה שלמה, עובדה שפקודה כמו (Select @S=(Select name From sys.sysobjects נכשלת מכיוון ששאילתת...

הפרוצדורה xp_cmdshell

יום חמישי, יולי 1, 2010

הפרוצדורה הנ"ל שהיא Extended Stored Procedure מאפשרת להריץ Command Lines שהשרת תומך בהם, מתוך SQL Server. קודם כל הכוונה לפקודות הוותיקות המוכרות לנו מימי DOS העליזים- Copy, Dir, Type, Del, MD, RD וכו', ובהמשך לכך Command Lines של מערכות שונות שהותקנו על השרת: SQL Server עצמו עם פקודות כמו BCP או SQLCMD, ועוד. החל מגרסת 2005 הפרוצדורה מנוטרלת כברירת מחדל בשל בעיות האבטחה הכרוכות בהפעלתה: הפקודה מופעלת על ידי השרת עם ההרשאות של ה-Agent בהתייחס ל-SQL Server ולשרת הפיזי, ומכיוון שיש לו בדרך כלל הרשאות גבוהות שאין לכל משתמש או מתכנת – ניתן להריץ בעזרת xp_cmdshell פקודות שונות מול ה-File System של...

קליטת קבצי טקסט לטבלה

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

נתחיל מהמקרה הפשוט ביותר: נתון קובץ טקסט עם שמות עובדים אותם יש לקלוט, ונשמור אותו בתור C:\Tmp\TxtFile1.txt: Avi Batya Carmel Dana ניצור טבלה מתאימה: Use tempdb; Go If Object_Id('T_Tmp1') Is Not Null Drop Table T_Tmp1; Go Create Table T_Tmp1(Txt Varchar(Max)); Go ונייבא את הנתונים מהקובץ לתוכה: Bulk Insert T_Tmp1 From 'C:\Tmp\TxtFile1.txt'; Go מה קורה אם בטבלה יש עוד עמודות מלבד זו שלתוכה יש לייבא את הנתונים? ניצור טבלה שכוללת מלבד עמודה Txt כנ"ל גם עמודת מספור אוטומטי ועמודת תאריך (עם תאריך שוטף כברירת מחדל) שמתמלאות מאליהן: If Object_Id('T_Tmp2') Is Not Null Drop Table T_Tmp2; Go Create Table T_Tmp2(Mone Int Identity, Txt Varchar(Max), ...

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

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

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