שוביט מחשוב

חיבור ב SCRIPT ל DB - חלק א'

סדרת החלקים של חיבור באמצעות SCRIPT ל DB תעסוק בחיבור באמצעות סקריפט ל Database מסוג MSSQL שזה SQL SERVER של מייקרוסופט. בחלק הזה אני אתן הקדמה קצרה, דגשים כללים, ונסקור כמה שורות של התחלת החיבור באמצעות SCRIPT של POWERSHELL.

כלי ניטור שונים מכילים בדרך כלל חבילות ניטור שונות שמנטרות את בסיסי הנתונים, ויכולות לספק תמונה בסיסית די טובה לאנשי הניטור ואפילו ל DBA אודות המצב בשרתי ה SQL\DB. דרך החיבור ל DB שתודגם במאמר היא באמצעות PowerShell לעיתים נרצה להריץ שאילתא ייעודית שאיננה כלולה בחבילות הניטור הבסיסיות שקיימות במערכות הניטור. זו יכולה למשל כל שאילתת SELECT על אפליקציה שהמידע שלה מאוכסן ב DB שרץ על שרת בסיס הנתונים.

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

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

לצורך המאמר התקנתי אצלי על המחשב גרסת SQL Exprees, יצרתי את הדברים הבאים :

  • התקנת ה SQL, קרי ה Instance, (שימו לב, לא מדובר בשם המחשב עצמו) נקראת ShobitSQL
  • DB שנקראת Shobit.
  • טבלה שנקראת shobitTable
  • נתוני טבלה : בטבלה יש שתי עמודות firstname ו - age, ושלוש שורות כדלקמן .
  • לצורך הפשטות, נתתי הרשאות מלאות למשתמש שלי ב Windows כדי שיוכל לגשת ל DB
זו תמונה שממחישה.

המודגש בצהוב - שם השרת ולאחריו שם ה Instance (כאמור shobitSQL). מודגש בירוק - שם ה DB מודגש בתכלת - שם הטבלה.

כל אחד יכול להריץ אצלו על המחשב איזה גרסת SQL Exprees (חינמי כמובן) ולהתנסות בעצמו באמצעות Powershell. זה אף מומלץ. חשוב לי לציין שעדיף להכיר את שלבי התקנת ה SQL, ולא רק ללחוץ על next>next>finish. לא מדובר במשהו מורכב. לענייננו, וצורך פשטות הדברים כן כדאי להכיר מושגים כמו SA (שזה Service Account) או Windows Authentication, וגם Named Instance או Native Instance. במושגים האלו כולנו נתקלים כאשר מתקנים שרת SQL מכל סוג (כולל SQL Express).

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

$con = New-Object System.Data.SqlClient.SqlConnection
$con.ConnectionString = "Server=os11\shobitSQL;Database=shobitDB;Integrated Security=true;"
$cmd = New-Object System.Data.SqlClient.SqlCommand;
$cmd.CommandText = "SELECT firstname,age FROM shobitTable"
$cmd.Connection = $con
$adapter =  New-Object System.Data.SqlClient.SqlDataAdapter
$adapter.SelectCommand = $cmd
$res = New-Object System.Data.DataSet
$adapter.Fill($res) | out-null

ויש את זה גם בתמונה :

לגבי שתי השורות הראשונות (יוצגו מיד מתחת) הן מייצגות :

א. בשורה הראשונה יש את אובייקט החיבור עצמו ש Powershell טוען לזיכרון.
ב. בשורה השנייה יש את אופן החיבור ל DB (מידע יגיע פירוט מלא). חשוב להדגיש כי אחרי שתי השורות האלו עדיין לא מתבצע החיבור ל DB עצמו (יגיע בהמשך) אלא רק הכנת התשתית.

אופן החיבור ל DB נקרא Connection String, והוא מכיל פרמטרים חשובים כמו : שם השרת + שם התקנת ה SQL ( ה INSTANCE) מיוצג בקטע המודגש בצהוב - במקרה שלנו - המחשב שלי (localhost) + שם ה Instance שהוא ShobitSQL. שם ה DB - מודגש בירוק. אופן החיבור - Integrated Security=True, שזה אומר שהאימות מתבצע עם המשתמש שמריץ את השאילתא דרך ה Powershell. לגבי הפרמטר האחרון בשורה השנייה ( Integrated Security) יש לשים לב שהגישה היא עבור המשתמש שקיבל את ההרשאות על ה DB. אין בהכרח קשר בין המשתמש הזה למשתמש שמריץ את ה Process של ה SQL SERVER (אפשר לראות דרך ה Task Manger מי מריץ את ה PROC).



דבר שחשוב לציין או שלפעמים האימות מול ה DB לא יהיה באמצעות Windows Authenticatio, אלא דווקא באמצעות SQL Service User (המשתמש הדיפולטי נקרא sa, אך אתם יכולים ליצור גם אחד משלכם). במקרה הזה ה Connection String יכול להיראות ככה :

Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword


שימו לב שבמקרה הזה כברירת מחדל חושפים סיסמה ב Connection String. לכן מומלץ למצוא דרכים להצפין את הפרטים, או לפחות להשתמש סיסמה עבור משתמש שיש לו הרשאות מינימליסטיות - קריאה על האובייקטים הרלוונטיים בלבד(או מה שצריך בנוסף לזה)