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

24/03/2016

אין תגובות

כדי לגשת משרת On Premise ל-Azure, ניתן להשתמש ב-Linked Server, אך כיצד לגשת מ-Azure ל-Azure? הרי גם פנייה מדטבייס אחד לאחר בתוך אותו שרת אינה אפשרית ב-Azure, אז לא כל שכן בין שרתים שונים..
בדטבייסים מגרסת V12 יש כעת פתרון יחודי, השונה מה-Linked Server המוכר בכך שלא יוצרים איזה אובייקט או קישור דרכו ניגשים לכל האובייקטים בדטבייס האחר, אלא לכל אובייקט יוצרים קישור נפרד המבוסס על תשתית משותפת.. הבנתם משהו?.. לא הרבה, והאשם ביכולת הניסוח הלקוייה שלי, ולכן טוב מראה עיניים: דוגמה!

ניגש קודם כל לדטבייס Azure ממנו נרצה לקרוא נתונים, וניצור שם טבלה עם מעט נתונים ו-View:

If Object_ID('T_Try','U') Is Not Null Drop Table T_Try;

Create    Table T_Try

        (ID Int Primary Key,

        Txt Varchar(10));

Go


Insert

Into    T_Try

Values    (1,'a'),

        (3,'ccc'),

        (4,'dddd');

Go


If Object_ID('V_Try','U') Is Not Null Drop Table V_Try;

Go

Create    View V_Try As Select * From T_Try;

Go

כעת ניגש לדטבייס Azure אחר בו נרצה לפנות לנ”ל, ונתחיל ללכלך את הידיים.
קודם כל ניצור באופן חד פעמי Master Key Encryption:

--Drop Master Key;

If        Not Exists (Select * From sys.key_encryptions Where    crypt_type_desc='ENCRYPTION BY PASSWORD')

        Create Master Key Encryption By Password='Geri1234';

כעת ניצור Database Scoped Credential שיכלול את ה-Login והסיסמה לדטבייס עם הנתונים:

--Drop Database Scoped Credential Cr2_Try;

If        Not Exists (Select * From sys.database_scoped_credentials Where name='Cr2_Try')

        Create    Database Scoped Credential Cr2_Try

                With Identity='WriteHereTheLoginName',

                    Secret='WriteHereYourSecretPassword';

כעת ניצור External Data Source שיכלול את שמות השרת והדטבייס ב-Azure אליהם ניגש עם ה-Credential הנ”ל:

--Drop External Data Source DS2_Try;

If        Not Exists (Select * From sys.external_data_sources Where name='DS2_Try')

        Create    External Data Source DS2_Try

                With (Type=RDBMS,

                    Location='TheServerNameInAzure.database.windows.net,1433',

                    Database_Name='TheDatabaseNameInAzure',

                    Credential=Cr2_Try);

עד כאן התשתית לגישה לדטבייס, ובעזרתה נבנה לכל אובייקט בדטבייס המרוחק – External Table משלו.
נתחיל בטבלה T_Try:

--Drop External Table T2_Try;

If        Not Exists (Select * From sys.external_tables Where name='T2_Try')

Create    External Table T2_Try

        (ID Int)

        With

        (Data_Source=DS2_Try,

        Schema_Name='dbo',

        Object_Name='T_Try');


Select * From T2_Try;

image

עובד!
כעת ניצור External Table ל-View:

--Drop External Table V2_Try;

If        Not Exists (Select * From sys.external_tables Where name='V2_Try')

Create    External Table V2_Try

        (ID Int)

        With

        (Data_Source=DS2_Try,

        Schema_Name='dbo',

        Object_Name='V_Try');


Select * From V2_Try;

image

גם עובד!

מגבלות:

  1. ניתן לפנות לטבלאות, ל-View ול-Synonyms; ותו לא.
  2. ניתן רק לשלוף נתונים, ולא לבצע פעולות Insert/Update/Delete.

שימוש מהנה!

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *