Bu makalede mssql’den mssql’e linked server kullanarak bağlanmayı anlatacağım. Bağlanma türlerine değinmeye çalışacağım. İlk bahsedeceğim bağlanma türü linked server security ekranında bulanan Be made using login’s current security context seçeneği olmuş olacaktır.
SQL Server, o an SQL Server’a bağlanmış olan kullanıcının kimlik bilgilerini (kullanıcı adı ve şifre) uzak sunucuya iletmek için kullanır. Kısacası Local login bilgileri ile uzakta olan sunucuya giriş yapmak için kullanılır. Örneğin eğer local sunucuda Windows Authentication seçeneği kullanılıyorsa uzak sunucuda da Windows Authentication seçeneğinde kullanılan bilgilerle giriş yapmayı deneyecektir.
Genellikle Windows Authentication kullanılan ortamlarda tercih edilir. Böylece, kullanıcıların merkezi bir kimlik doğrulama sistemi üzerinden kimlikleri doğrulanırken, aynı kimlik bilgileriyle bağlı sunucuya erişim sağlanır.
Windows Authentication kullandığınızda, bağlantı mevcut kullanıcının Windows kimlik bilgileriyle sağlanır ve bu da güvenli bir bağlantı sağlar. Ancak, SQL Server Authentication kullanıyorsanız, login oluşturulmalı ve SID doğru bir şekilde eşleştirilmelidir.

Bu bağlanma şeklinde kaynakta(S2 Sunucusu) yetkili olmayan hiç bir lokal login bu linked server’ı kullanamayacaktır. Ama unutmayalım ki bu linked server’ı sadece kaynak ve hedefte(S1 Sunucusu) aynı login varsa kullanabilirsiniz. Aynı Login’den kastımız sadece isimlerinin ve şifrelerinin aynı olması değildir. Kaynaktaki ve Hedefteki Login’lerin SID’lerinin aynı olmasıdır. Local login’inde hedefe doğru şekilde bağlanmasını istiyorsak security bölümünde bazı konfigürasyonların yapılması gerekmektedir
Senaryomuza geçmeden önce ilk başta linked server nedir ne gibi avantajları ve dezavantajları vardır bunlardan bahsedelim.
Linked Server ile uzaktaki bir veri kaynağından veri okumanıza ya da sorgu çalıştırmanıza olanak sağlayan bir özelliktir. A ve B veri tabanları arasındaki tablolarda sanki aynı veri tabanındaki tablolarda yapabildiğiniz gibi JOIN vb. işlemleri gerçekleştirebilirsiniz. Bahsettiğimiz veri tabanları aynı sunucu üzerinde olabildiği gibi farklı sunucularda da olabilir.
Microsoft sayfasında almış olduğum resimle linked server nasıl çalıştığını ele alalım.

Kullanıcı uygulamadan Sql Server’a sorgu iletir. Sql Server eğer linked server kurulmuş bir sistem var ise o sistem ile veri alış verişini OLE DB providers üzerinden yapar. Hedef sisteme İstemcinin isteğini bildirilir. Hedef sistemde istek icra görür ve geriye değer dönüyor ise yine OLE DB provider’lar aracılığı ile Sql Servera iletilir ve sorgu tamamlanır.

En stabil ve güvenilir seçenek Microsoft OLE DB Provider for SQL Server çoğu senaryo için yeterli performans sağlar.
Daha yeni ve geliştirilmiş bir provider seçeneği ise MSOLEDBSQL (Microsoft OLE DB Driver for SQL Server) daha yeni ve geliştirilmiş bir provider sağlamaktadır. Güvenlik ve performans anlamında daha iyidir.
SQL Server Native Client seçeneği ise microsoft 2022 ile desteklenmemektedir.
Genellikle yeni sql server sürümlerinde Önce Microsoft OLE DB Provider for SQL Server ile deneyin, eğer sorun yaşarsanız MSOLEDBSQL provider’ına geçilmelidir.
Not: Sql server önceki sürümlerinden farklı bir ortamdaki sql server sürümüne linked server bağlantısı sağlanacaksa provider seçeneklerine dikkat edilmesi gerekmektedir.
Senaryom şu iki farklı sunucumuz var S1 ve S2, S1 sunucundaki bir login oluşturulup login sid ile birlikte sp_help_revlogin procedürüyle ‘A1’kullanıcısını create script’ini alıp ikinci server’da(S2) oluşturuyorum S1 ve S2 sunucularındaki login sid’leri aynı olduğu için aynı kullanıcı olmuş olacak.(Aşağıda yapacağım örnek senaryolar için bu işlemi yapıyorum direk konuya girmeyip adım adım gidiyorum)
exec sp_help_revlogin 'A1'
Bu script’i çalıştırdığımda aşağıdaki hatayı alıyorum sebebi ise bu store procedure yüklü değil yükleme işlemini yaptıktan sonra tekrar çalıştıralım komutu

Microsoft’un sayfasından ilgili procedure’ü kopyalayıp sunucumda çalıştırıyorum. Çalıştırdıktan sonra A1 kullanıcısının create script’ini alabilmiş oldum.

Bu script’i kopyaladıktan sonra ikinci sunucumda çalıştırıyorum ve A1 kullanıcısını oluşturuyorum.(S1 ve S2 sunucularımda aynı login var.)
exec sp_help_revlogin 'A1'
CREATE LOGIN [A1] WITH PASSWORD = 0x02005D83A199CA5533AD087281D3F52751EF26F8FA022FD6786B5379BE6395E7EC4F3583E882F4B82C7C314687F7F3AD5A7F2889C30DED04BCC112DC608D30964DD0C1088F3C HASHED, SID = 0x1005D45A1D6D414AB5D59467C0DAEBD4, DEFAULT_DATABASE = [master], DEFAULT_LANGUAGE = [us_english], CHECK_POLICY = OFF, CHECK_EXPIRATION = OFF
Dikkat edersek script in hash’lenmiş haline bize veriyor.

Yukarıda A1 login’ini S2 sunucusunda oluşturduktan sonra S2 sunucusunda B1 isminde rastgele bir login oluşturuyorum deneme işlemlerini yapmam için.
S2 sunucusunda belirttiğim işlemleri yapıyorum.

A1 login’inin yetkili olduğu veritabanları gözüküyor.(linked server ile bağlantı kurduğumuzda gelecek veritabanı)

Şimdi ben burada S2(kaynak) sunucusundan linked server tanımlayacağım S1(hedef) sunucusundan verilerimi almak için.(Yukarıda görüldüğü gibi A1 kullanıcı üzerinden AdvantureWorks2012 db’yi görmek)
SQL’e bağlandıktan sonra Server Objects>Linked Servers’a sağ tıklanır ve New Linked Server denilir.

Burada new linked server dedikten sonra işlemlerime başlıyorum.

Linked server: Eğer server type kısmımız sql server ise linked server kısmına bağlanacağımız sunucu adı ve instance adı veya ip bilgilerinin instance adının girilmesi gerekmektedir. Eğer other data source seçersek herhangi bir isim verebiliriz. Sunucu adı veya instance adı belirtmemize gerek yoktur.
Server Type: Eğer bir SQL Instance’ına bağlanılacaksa yukarıdaki gibi SQL Server seçilebilir. Farklı bir kaynaktan veri çekilecekse Other Data Source işaretlenebilir. Yine SQL’e de Other data source diyerek erişebilirsiniz. Bu kaynaklara Other data source’u seçtikten sonra Provider kısmından ulaşabilirsiniz.
Hedefteki sunucu ismini ve instance ismini yazıyorum sql server’dan sql server’a bağlantı sağlayacağım için server type kısmından sql server’ı seçiyorum.
Sonra security bölümünden makalemizin ana başlığı olan Be made using login’s current security context üzerinden işlem yapacağım.
Birinci yöntem Be made using login’s current security context bu seçenek şu anlama geliyor yukarıda açıklamıştık tekrar olsun. Mevcut loginleri güvenli bağlantıda kullanarak açma işlemi(iki sunucuda aynı eş login). Daha açıklayıcı olmak gerekirse S1 ve S2 sunucularındaki sid’leri aynı olan kullanıcıların arka planda bir birleriyle eşleşerek güvenli bir bağlantı şeklidir S1 sunucusunda A1 login’inin hangi veritabanında yetkisi varsa S2 sunucusunda o login ile giriş yaptığımızda linked server’da o kullanıcının S1 sunucusunda tanımlandığı veritabanları önüne gelecektir. Çünkü bu seçeneği seçerek hedefte yetkili olmayan hiçbir kullanıcının bu linked server’ı kullanamamasını garantilemiş oluyoruz(bu senaryo için başka kullanıcılarımızı oluşturmuştuk)

S2 sunucusunda linked server’ı yukarıda resimde görüldüğü gibi tanımladık. S1 sunucusuna linked server la girdiğimiz için linked server’ın altında tüm veritabanları gözükür.

İlk başta tanımlamış olduğum A1 ve B1 kullanıcıları ile S2 sunucusuna login olup test işlemine başlayalım.
A1 kullanıcısı iki sunucuda ortak Bu yüzden A1 kullanıcısının tanımlı olduğu S1 sunucusunda hangi veritabanında yetkileri varsa onları görmüş oluyoruz.

İki sunucuda(S1-S2 sunucuları) ortak sid ile oluşturulan login ile S2 sunucusunda bağlandığımızda linked server’ın geldiğini görmüş olacağız.(A1) Dikkat ederseniz S2\administrator ile giriş yaptığımızda S1 sunucundaki tüm veritabanları görülmüş olur. Şuan sadece A1 kullanıcısının yetkili olduğu veritabanı gelmiş oldu.

Sql server arka planda iki sunucuda sid’leri karşılaştırıp bu login’lerin aynı olduğuna karar veriyor özel bağlantıyı sağlıyor bağlantıyı sağladıktan sonra S1 sunucunda hangi login hangi veritabanlarına yetkiliyse onlar geliyor. S1 sunucusunda A1 login’in yetkili olduğu veritabanlarıda önümüze geldi.

Gerçek sistemde herhangi bir veritabanında linked server bağlantısı sağlayacak kullanıcı yetki isterse ilk olarak verileri alacağı sunucu üzerinde ilgili veritabanına public yetkisi verilir. Amaç tüm tabloları veya viewleri görmemesi kullanıcının istediği doğrultusunda tablo bazlı yetkiler verilmektedir.
Linked Server ile nasıl sorgu çekilir. 2 yöntem vardır
1.Openquery
Select * From Openquery ([S1\TEST],'select * From [AdventureWorks2012].[Person].[Address]')
2.Four-part Name

S1 sunucusunda loginin yetkili olduğu ilgili veritabanında bulunan tabloyu linked server aracılığıyla çekmiş oldu.

Şimdi diğer kullanıcı(B1) ile bağlantı sağlayalım burada ise login olduğumuz kullanıcının sid ile S1 sunucusunda var mı diye bakacak varsa o kullanıcının yetkili olduğu veritabanlarını önümüze getirmiş olacak yoksa sadece linked server bağlantısını görmüş olacak.(linked server kurulumunu S2\administrator kullanıcısı altında yaptığımız için tüm oluşturulan kullanıcılar görebilir yetki vermemiz dahilinde linked server’ı kullanabilirler.)

Dikkat edersek B1 kullanıcısın altına linked server geldi. Bu linked server ismi sadece S2\TEST-S2\administrator de tanımlanmadığı için gelmiş oldu. Dikkat edersek linked server boş sadece A1 kullanıcısı iki sunucuda aktif olduğu için kullanabiliyor. Peki ben B1 kullanıcısını S1 sunucusuna eklemeden Be made using login’s current security context yöntemiyle kullanabilirmiyim. Cevap EVET

S2\TEST instance’ımızda önceden kurmuş olduğumuz linked server’ı düzenleyelim. Burada B1 kullanıcısını login olduktan sonra linked server ı kullanabilmesi için A1 logini üzerinden bağlantı yapması gerekmektedir. Remote Password kısmında A1 kullanıcısının gerçek sistem üzerinde kullandığı şifre gerekmektedir.

Bu şekilde bağlanma denediğimde S2 sunucusunda local’de oluşturulan B1 kullanıcısının, her iki sunucusunda aynı sid ile oluşturulan A1 kullanıcısını kullanarak girmeye çalıştığını görmekteyiz.

Yukarıdaki bölümün örneği bu linked server’ın properties bölümüne baktığımda yukarda oluşturmuş olduğum bağlantının geldiğini görmekteyim.
Not: Gerçek sistem üzerinde aynı instance altında birden fazla linked server kurulmaz. Sebebi farklı kullanıcılar için oluşturulan linked server ne kadar sid ile oluşturulan kendi kullanıcı adı ve şifresiyle veya windows bağlantısıyla giriş yaptıktan sonra diğer linked server bağlantılarınıda görür yukarıda B1 kullanıcısıylada teyit etmiş olduk. Bu sebepten ötürü gerçek sistemde her linked server kullanıcısı için ayrı bir instance kurulup ilgili login sid create scripti çalıştırılır son kullanıcı kullanıcı adı ve şifresiyle kendi instance’ına girebilir. Son kullanıcıya kendisi için oluşturulan instanceda administrator yetkisi verilmez sadece oluşturulan kullanıcısı ile giriş yapmaktadır. Linked server yapısını dba yöneticileri oluşturması gerekmektedir.
Başka bir makalede görüşmek üzere…
“Ey Peygamber! İnsanları, azabın geleceği gün ile korkut. O gün, zalimler şöyle diyecekler: “Ey Rabbimiz! Bizi yakın bir zamana kadar ertele de senin davetine uyalım ve peygamberlere tâbi olalım.” Onlara: “Daha önce ahirete intikal etmeyeceğinize dair yemin etmemiş miydiniz?” denilir.”İbrahim-44