External Data Source: תחליף ל-Linked Server ב-Azure

יום שני, ספטמבר 11, 2017

לפני יותר משנה כתבתי פוסט על פנייה בין דטבייסים שונים ב-Azure. והראיתי כיצד ניתן ליצור External Tables, כלומר – קישור לטבלאות בדטבייס אחר ב-Azure. לא כמו Linked Server שמאפשר לגשת לכל מה שיש בשרת (בכפוף להרשאות), External Tables הוא לטבלה בודדת. מי שרוצה יותר מזה, יכול להיעזר באותה תשתית (Master Key + Database Scoped Credential) כדי ליצור  External Data Source, שהוא המקבילה ל-Linked Server בעולם ה-Azure, כשמדובר באובייקט ברמת הדטבייס. קודם כל ניצור באופן חד פעמי Master Key Encryption (אם יש- אי אפשר ואין צורך באחד נוסף): --Drop Master Key;If Not Exists (Select * From...

Linked Servers – מקרים מיוחדים

יום שלישי, ינואר 31, 2017

ברוב במקרים, כשיוצרים Linked Server הולכים בדרך הישר: קישור לשרת ב-Dommain שלנו אליו אנחנו פונים ב-Linked Server ששמו כשם השרת, ויוצרים אותו בקלילות בעזרת ה-Wizard ב-SSMS.לעיתים יש מקרים מיוחדים, ואז צריך להתחיל לעבוד עם פרוצדורות המערכת ולהסתבך קצת (אני מדבר רק על עצמי..). לפני כשנה וחצי הצגתי את הקוד ליצירת Linked Server ל-SQL Azure, אך אחזור על כך לידיעת המאזינים שהצטרפו זה עתה: Exec master.dbo.sp_addlinkedserver @server=N'MyLinkedServer', ...
אין תגובות

פנייה בין דטבייסים שונים ב-Azure

יום חמישי, מרץ 24, 2016

כדי לגשת משרת On Premise ל-Azure, ניתן להשתמש ב-Linked Server, אך כיצד לגשת מ-Azure ל-Azure? הרי גם פנייה מדטבייס אחד לאחר בתוך אותו שרת אינה אפשרית ב-Azure, אז לא כל שכן בין שרתים שונים.. בדטבייסים מגרסת V12 יש כעת פתרון יחודי, השונה מה-Linked Server המוכר בכך שלא יוצרים איזה אובייקט או קישור דרכו ניגשים לכל האובייקטים בדטבייס האחר, אלא לכל אובייקט יוצרים קישור נפרד המבוסס על תשתית משותפת.. הבנתם משהו?.. לא הרבה, והאשם ביכולת הניסוח הלקוייה שלי, ולכן טוב מראה עיניים: דוגמה! ניגש קודם כל לדטבייס Azure ממנו נרצה לקרוא נתונים, וניצור שם טבלה עם מעט נתונים ו-View: If Object_ID('T_Try','U') Is Not...
אין תגובות

Linked Server to SQL Azure

יום רביעי, אוגוסט 19, 2015

יש כמה דגשים ביצירת Linked Server ל-SQL Database ב-Azure (המכונה במקומנו PAAS).ראשית, הסינטקס ליצירת ה-Linked Server: Use master;Go Exec master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'', @provider=N'sqlncli', @datasrc=N'SQLAzureServer.database.windows.net', @catalog=N'MyDB';Exec master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'False',@locallogin=NULL,@rmtuser=N'MyLogin',@rmtpassword='MyPassword';Go MyLinkedServer – השם של האובייקט שניצורSQLAzureServer.database.windows.net – שם השרת (תמיד SQL Database יהיה משוייך לשרת)MyDB – שם הדטבייס, ובניגוד למקובל – כאן חובה לציינו.MyLogin – שם ה-Login ב-Azure.MyPassword – הסיסמה ב-Azure. השימוש ב-Linked Server: השימוש הוא כמקובל, יש לציין כמובן את שם הדטבייס בפנייה, וניתן לפנות רק לזה שצויין בהגדרת ה-Linked Server. כלומר- זהו Linked Server לדטבייס ספציפי ולא לכל הדטבייסים בשרת.
אין תגובות

Timeout: Connection & Query

יום חמישי, פברואר 5, 2015

מדובר בשני פרמטרים ב-Linked Servers שבדרך כלל מותירים אותם עם ערכי ברירת המחדל 0.למה הם משמשים? ניצור Linked Server ונראה.ניכנס קודם כל לשרת היעד (אליו פונה ה-Linked Server) וניצור בו Login מתאים בו נשתמש כשנפנה משרת המקור, ונפנק אותו בהרשאות מלאות כדי שלא זה מה שיעצור אותנו: Use master;GoCreate Login MyLogin With Password='123456',Check_Policy=Off;Go Alter Server Role sysadmin Add Member MyLogin;Go כדאי לוודא שהשרת מקונפג בתור SQL Authentication ולאתחל אותו אם משנים את ההגדרה: בלי זה זה לא יעבוד.נחזור לשרת המקור, ניצור Linked Server ונקנפג אותו: Use master;Go EXEC master.dbo.sp_dropserver @server=N'MyLinkedServer', @droplogins='droplogins'EXEC master.dbo.sp_addlinkedserver @server = N'MyLinkedServer', @srvproduct=N'', @provider=N'SQLNCLI', @datasrc=N'MyRemoteServerEXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname=N'MyLinkedServer',@useself=N'False',@locallogin=NULL,@rmtuser=N'MyLogin',@rmtpassword='123456'GO EXEC master.dbo.sp_serveroption @server=N'MyLinkedServer',...
אין תגובות

Distributed Transaction: שימוש בטרנזקציות וב-Linked Server

יום שלישי, דצמבר 23, 2014

הנדון: טיפול בטרנזקציה המתפצלת לעוד שרת.המצרכים: שני שרתים, ו-Linked Server מהאחד לשני (אצלי הוא נקרא GeriTo), כאשר יש לוודא שה-RPC מאופשר (היכולת להריץ פרוצדורות דרכו ולא רק פקודות Select): נתחיל מהמקרה הפשוט בו יש טרנזקציה בצד השני ולא במקומי, ולכן היא לא “עוברת” דרך ה-Linked Server.ניצור בצד השני טבלה ופרוצדורה שמכניסה לתוכה נתונים: Use tempdb;Go If Object_ID('MyTbl','U') Is Not Null Drop Table MyTbl;Go Create Table MyTbl(ID Int Primary Key);Go If Object_ID('MyProc','P') Is Not Null Drop Proc MyProc;GoCreate Proc MyProc @ID Int AsBegin TryBegin TranInsert Into MyTbl Values(@ID);CommitEnd TryBegin CatchPrint '@@ServerName=, DB_Name()=, '+IsNull(Object_Name(@@ProcID),'פרוצדורה לא ידועה')+': Error_Procedure()='+IsNull(Error_Procedure(),'פרוצדורה לא...
אין תגובות

כיצד מבצעים 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 וכעת פרוצדורה ששולפת ערך דרכו,...
אין תגובות

בדיקת תקשורת

יום שלישי, נובמבר 4, 2014

הלו? אני באדי הום?אנחנו פונים בקוד לשרת אחר דרך Linked Server. מה קורה אם אין קשר (השרת למטה, אין הרשאות, הקישור לא קיים..)? בדרך כלל נעוף עם הודעת שגיאה או שנעוף מה-Try ל-Catch ושם הכל יטופל כחוק וכו’.היה עדיף לבצע בדיקה אם יש תקשורת, ורק אם כן- לבצע את הפקודה הפונה ל-Linked Server.להלן פרוצדורה שתקבל שם של שרת כפרמטר, תבצע בדיקה האם יש תקשורת, ותחזיר בהתאם 1 או 0: If Object_ID('P_LinkedServerConnected','P') Is Not Null Drop Proc P_LinkedServerConnected;GoCreate Proc P_LinkedServerConnected @Server Sysname, ...
3 תגובות

פניה משרת 2005 לגרסה מתקדמת יותר דרך Linked Server: בעיית An invalid tabular data stream (TDS) collation was encountered

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

2005? תזכירו לי מתי זה היה?..יש עדיין התקנות של 2005 בעולם וגם של גרסאות מוקדמות יותר, צריך לתמוך בהן, וכל זה בסביבה בה יש גם גרסאות מתקדמות יותר; וכתוצאה מכך העניינים קצת חורקים.הדוגמאות שלהלן הורצו על שרת 2005, המחובר דרך Linked Server לשרת 2012; ואני מציג כאן תהליך מתגלגל של פתרון מאולתר של בעיות שמסתיים בהצלחה. יתכן ויש פתרונות מסודרים יותר, אך לא הצלחתי למצוא כאלה בעצמי או ברשת, ולמי שיהיו הצעות משופרות - אשמח לשמוע. נתחיל בשליפה פשוטה: Select database_idFrom .master.sys.databases; זה כן יעבוד בעזרת OpenQuery (וכפי שנראה בהמשך- גם בעזרת...
אין תגובות

כיצד להריץ שאילתת SQL לשליפת נתונים מה-OLAP

יום שישי, ינואר 1, 2010

לפני מספר שנים עבדתי על מערכת דוחות ב-Reporting Services שהתבססה על קוביות OLAP. אחד הדוחות היה מאוד מורכב ולא ניתן היה לבצע אותו בעזרת MDX (כלומר- שליפה מקוביית ה-OLAP), ונאלצנו בלתי ברירה להתבסס על טבלת ה-Fact  שב-SQL Server (טבלת המקור של הקוביה). זה יצר בעייה חדשה: ב-OLAP מומשה מערכת הרשאות שאיפשרה למנהל של כל אזור לראות רק את הנתונים של האזור שלו, אבל כל זה לא היה קיים בטבלת ה-Fact, והדוח שיצרנו היה מאפשר לכל אחד לעיין בכל הנתונים.. מה עושים? לבנות מערכת הרשאות מקבילה ב-SQL Server זה בלתי אפשרי- תקציב הפיתוח כבר נוצל, היינו אמורים לסיים בהקדם את הדוחות, ולהקמת מערכת...