Azure Üzerinde Cross Database’den Sorgu Çekme
Selamlar,
Bu makalede, Azure üzerinde 2 farklı database üzerinde bulunan tablolardan, tek bir sorgu çekilecektir. (Cross DB Query)
1-) Öncelikle gelin Azure üzerinde 2 farklı Sql DB yaratalım:
Aşağıda görüldüğü gibi Database sekmesinden, Sql Database seçilir.
Aşağıda görüldüğü gibi, Person adında bir Database yaratılır.
Aşağıda görüldüğü gibi, Structure Sql Database’i de benzer şekilde oluşturulur.
Person DB’si üstünde Student Tablosu, aşağıdaki gibi oluşturulur:
1 2 3 4 5 6 7 8 9 10 11 |
CREATE TABLE [dbo].[Student]( [Id] [int] IDENTITY(1,1) NOT NULL, [FirstName] [varchar](50) NULL, [LastName] [varchar](50) NULL, [SchollId] [int] NULL, [TCKN] [varchar](20) NULL, CONSTRAINT [PK_Student] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] |
Structure DB’sinde de Scholl Tablosu,aşağıdaki gibi oluşturulur:
1 2 3 4 5 6 7 8 |
CREATE TABLE [dbo].[Scholl]( [Id] [int] IDENTITY(1,1) NOT NULL, [Name] [varchar](50) NULL, CONSTRAINT [PK_Scholl] PRIMARY KEY CLUSTERED ( [Id] ASC )WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] ) ON [PRIMARY] |
Not: “Az önce oluşturulan Scholl ve Student Tablolarına, Dummy Data atma işini size bırakıyorum :)”
Şimdi sıra geldi, bu 2 farklı database üzerindeki tabloları Joinleyip Sorguyu çekmeye.
Bunun için, öncelikle veritabanın bir Master Key’i olması gerekmektedir.
1-)MASTER KEY oluşturulur:
1 |
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '*******'; |
2-) EXTERNAL DATA SOURCE CREDENTIAL: Şimdi sıra geldi harici veritabanına erişim için gerekli bilgilerin tanımlanmasına. Burada girilen bilgilerin, diğer database’e erişmek için kullanılan SQL Kimlik Doğrulaması ile tamamen aynı olması gerekmektedir.
NOT: Login olunan user’ın, DB’de erişilecek tüm kaynaklara yetkisinin olması gerektiğini unutmayın. Örneğin bu makalede Structure Server’ına, Person Server’ından erişilebilmesi için Credential tanımlanmıştır.
1 2 3 |
CREATE DATABASE SCOPED CREDENTIAL ExternalAccessCredential WITH IDENTITY = 'userName', SECRET = 'password'; |
3-) EXTERNAL DATA SOURCE : Şimdi sıra geldi, bulunulan DB’den(Person) ==> dışardaki bir DB’ye(Structure) erişmeye. Kısaca Person DB’si üzerinden, Structure DB’sine erişecek bir Kaynak oluşturulur.
ExternalAccessCredential: Yukarıda tanımlanan DB’nin erişim bilgileridir.
1 2 3 4 5 6 7 8 |
CREATE EXTERNAL DATA SOURCE RefStructure WITH ( TYPE=RDBMS, LOCATION='tcp:coder.database.windows.net,1433', DATABASE_NAME='Structure', CREDENTIAL= ExternalAccessCredential ); |
4-) EXTERNAL TABLE : Son adım olarak, diğer DB’den erişilecek tablonun eşleniğinin, bulunulan yani sorgu yapılan DB’de de yaratılmasına geldi. Bu örnekde “Structure” DB’sindeki “Scholl” tablosunun eşleniği, “Person” DB’sinde de yaratılmıştır. İlgili tablonun adı, datanın çekileceği kolonların adları ve türleri birbirleri ile eşleşmelidir. En sona konan WITH ile, erişilecek veri kaynağı belirtilir.
NOT: Burada yaratılan tablo, bir çeşit Adaptor görevi görmektedir. Kısaca datanın çekileceği tablonun, tüm kolonlarının tanımlanmasına gerek yoktur. Sadece istenen kolonların ad ve tiplerinin, birbirleri ile eşleşmesi şartı ile tanımlanması yeterlidir.
1 2 3 4 5 6 7 8 |
CREATE EXTERNAL TABLE [dbo].[Scholl]( [Id] [int] NOT NULL, [Name] [varchar](50) NULL ) WITH ( DATA_SOURCE = RefStructure ); |
5-) SONUÇ TEST: İki farklı Database’deki (Student, Scholl) tablolarından (Cross Database) sorgu aşağıdaki gibi çekilmiştir. Sorgunun hemen altında, dönen kümülatif result ekrana basılmıştır.
1 2 3 |
SELECT S.Id,S.FirstName,S.LastName, SC.Name as Scholl FROM Student as S INNER JOIN Scholl AS SC ON S.SchollId = SC.Id |
Bu makalede, bussines gereği farklı DB’lerden çekilen “Cross Database Sorgusunun” nasıl olması gerektiğini, 5 adımda inceledik. İlk sorgu çekildiği anda, farklı bir DB’den de credentiallar ile izin alması gerekmesinden dolayı, ilk çalışma süresi normalin biraz üzerinde olabilir. Yoğun, anlık yükün çok olduğu performansın önemli olduğu projelerde, aynı network üzerinde olmayan DB’lerden data çekilmesi, özellikle oluşabilecek yavaşlıklardan dolayı tercih edilmemelidir.
Geldik bir makalenin daha sonuna. Yeni bir makalede görüşmek üzere hepinize hoşçakalın.
Source:
Hocam teşekkürler makale için. Linked server dan farkı db lerin azure üzerinde çalışması mı?
Selam Erdinç,
Hayır. Bu direk Sql üzerinde çalışan bir yapı. Bu makalede sadece DBler Azure üzerinde o kadar. Linked’in de tüm DB birbiri ile bağlantılı. Bu örnekde sadece ilgili tabloları External Data Source olarak tanımlıyorsun. Bu da demek oluyor ki performance.
İyi çalışmalar.
makale için teşekkürler, scholl değil school olacaktı gözden kaçmış sanırım :)
Aynen. Teşekkürler :)