İÇİNDEKİLER
- •Kısa Cevap: Güvenli ve Hızlı Bir SQL Server Linked Server
- •Linked Server Nedir?
- •Linked Server'larınızı Güvenli ve Hızlı Hale Getirin
- •Başka Bir SQL Server’a Linked Server Nasıl Oluşturulur?
- •Oracle, PostgreSQL ve Diğer ODBC Kaynaklarına Linked Server
- •Oracle
- •PostgreSQL, MySQL ve Diğer ODBC Kaynakları
- •Üçüncü Parti ve Özel Sağlayıcılar
- •PolyBase Ne Zaman Daha Uygun?
- •SQL Server 2025: Linked Server’ları Bozan Şifreleme Değişikliği
- •Linked Server Güvenliği: Login Eşlemeleri
- •Linked Server Hangi Güvenlik Modelini Kullanmalı?
- •Linked Server Nasıl Sorgulanır?
- •Linked Server Üzerinden Table-Valued Function Çağırma
- •Linked Server Performansı
- •OPENQUERY mi Four-Part Name mi: Hangi Desen Daha Hızlı?
- •Bilinmesi Gereken Linked Server Seçenekleri
- •Sürüm Notları
- •Linked Server’larınızı Denetleyin
- •Kaynaklar ve Gözden Geçirme Tarihi
- •Linked server’larınızı kontrol altına alın
Linked server, bir SQL Server instance’ının başka bir veri kaynağını yereldeymiş gibi sorgulamasını ve orada komut çalıştırmasını sağlar: başka bir SQL Server, Azure SQL Managed Instance, Oracle ya da OLE DB sağlayıcısı olan herhangi bir kaynak. SQL Server’ın en eski entegrasyon özelliklerinden biridir ve özellikle raporlama, ERP entegrasyonları ve kademeli migrasyonlarda hâlâ en çok kullanılanlardan biridir.
Aynı zamanda yanlış kurulması kolay bir özelliktir. Varsayılan ayarlar, uzak sunucudaki yetkileri sessizce dağıtan login eşlemeleri oluşturur; four-part name ile yazılmış bir sorgu tüm uzak tabloyu ağ üzerinden çekebilir. SQL Server 2025 ise varsayılan şifreleme davranışını değiştirerek birçok mevcut linked server’ın upgrade sonrasında çalışmamasına yol açtı.
Bu rehberde bir linked server’ın güncel ve desteklenen yöntemle nasıl oluşturulacağını, nasıl güvenli hale getirileceğini, verimli şekilde nasıl sorgulanacağını, uzak table-valued function’ların nasıl çağrılacağını ve SQL Server 2025’e geçmeden önce nelerin kontrol edilmesi gerektiğini anlatıyoruz.
Kısa Cevap: Güvenli ve Hızlı Bir SQL Server Linked Server
Bir linked server şu dört koşul sağlandığında güvenli ve hızlıdır:
MSOLEDBSQLve açıkça belirtilmişEncryptayarı kullanılır. SQL Server 2025 bu kararı sizden bekler; aşağıdaki sürüm notlarına bakın.- Login eşlemesi açık ve en az yetkiyle yapılır. Varsayılan eşlemeyi silin; belirli bir yerel login’i yalnızca entegrasyonun ihtiyaç duyduğu yetkilere sahip özel bir uzak login’e eşleyin ya da Kerberos delegation çalışıyorsa Windows pass-through kullanın.
- Ağır filtreleme uzak tarafta yapılır. Four-part name’in büyük bir tabloyu ağdan çekmesine izin vermek yerine
OPENQUERYya da bir geçici tablo kullanın. - Her linked server envantere alınır ve upgrade öncesi test edilir. Bunları kullanan job’lar ve raporlar çoğu zaman yalnızca gece bozulur.
Aşağıdaki tablolar güvenlik ve sorgu desenleri için karar tabloları sunar. Her satır Microsoft dokümanı (bağlantılı Microsoft sayfalarında yazan) ya da Saha pratiği (bizim önerimiz, Microsoft gereksinimi değil) olarak etiketlenmiştir.
Linked Server Nedir?
Bir linked server tanımı iki parçadan oluşur: uzak sistemle konuşan sürücü olan OLE DB sağlayıcısı ve işaret ettiği sunucu ya da dosya olan OLE DB veri kaynağı. Tanım oluşturulduktan sonra uzak nesnelere linked_server.veritabani.sema.nesne biçiminde four-part name ile erişir ya da sorguyu OPENQUERY veya EXECUTE ... AT ile uzak tarafa gönderirsiniz.
Linked server’lar SQL Server’da ve bazı kısıtlamalarla Azure SQL Managed Instance’ta kullanılabilir. Azure SQL Database’de yoktur.
Linked Server'larınızı Güvenli ve Hızlı Hale Getirin
Aryasoft'un kıdemli DBA ekibi linked server envanterinizi, login eşlemelerinizi ve yavaş dağıtık sorgularınızı inceler; SQL Server 2025 geçişine hazırlar.
Başka Bir SQL Server’a Linked Server Nasıl Oluşturulur?
SSMS’te Server Objects‘i açın, Linked Servers‘a sağ tıklayıp New Linked Server‘ı seçin. Bu pencere sysadmin üyeliği gerektirir ve bazı ayarları gizler; birden fazla sunucuda tekrarlayacağınız işler için script daha iyidir:
USE master;
GO
-- 1. Linked server'ı Microsoft OLE DB Driver (MSOLEDBSQL) ile tanımla
EXEC sys.sp_addlinkedserver
@server = N'SALESDB', -- sorgularda kullanacağınız ad
@srvproduct = N'',
@provider = N'MSOLEDBSQL',
@datasrc = N'sqlsales01.corp.local\PROD',
@provstr = N'Encrypt=Mandatory;'; -- uzak sunucuda güvenilir bir sertifika gerektirir
-- 2. Tüm yerel login'lere uygulanan varsayılan eşlemeyi kaldır
EXEC sys.sp_droplinkedsrvlogin @rmtsrvname = N'SALESDB', @locallogin = NULL;
-- 3. Yalnızca erişmesi gereken login'i, en az yetkili bir uzak login'e eşle
EXEC sys.sp_addlinkedsrvlogin
@rmtsrvname = N'SALESDB',
@useself = N'False',
@locallogin = N'CORP\svc-reporting',
@rmtuser = N'ls_reporting_reader',
@rmtpassword = N'';
-- 4. Bağlantıyı test et
EXEC sys.sp_testlinkedserver N'SALESDB';
Not
Sağlayıcı olarak Microsoft OLE DB Driver for SQL Server, yani MSOLEDBSQL kullanın. Microsoft, SQLNCLI yerine bunu öneriyor. SQL Server 2019 ve öncesinde @provider belirtilmezse SQLNCLI kullanılır; SQL Server 2022’den itibaren sağlayıcı adını açıkça belirtmeniz gerekir. SQL Server Native Client (SQLNCLI, SQLNCLI11) SQL Server 2022’de kaldırıldı; eski SQLOLEDB sağlayıcısı da önerilmiyor.
Oracle, PostgreSQL ve Diğer ODBC Kaynaklarına Linked Server
Linked server yalnızca SQL Server ile sınırlı değildir. OLE DB sağlayıcısı olan her veri kaynağı bağlanabilir; Microsoft OLE DB Provider for ODBC (MSDASQL) üzerinden de ODBC sürücüsü olan her kaynak. Kaynak hangisi olursa olsun, sağlayıcı ya da sürücü SQL Server makinesinin kendisine, SQL Server ile aynı bit mimarisinde (güncel her instance için 64-bit) kurulmalı ve SQL Server servis hesabının sağlayıcının kurulu olduğu klasörde okuma ve çalıştırma yetkisi olmalıdır.
Oracle
Oracle için SQL Server makinesine Oracle Provider for OLE DB (OraOLEDB.Oracle) içeren Oracle client’ı kurun ve hedef veritabanı için bir TNS alias tanımlayın. Bu alias, linked server’ın veri kaynağı olur:
EXEC sys.sp_addlinkedserver
@server = N'ORAERP',
@srvproduct = N'Oracle',
@provider = N'OraOLEDB.Oracle',
@datasrc = N'ERPPROD'; -- tnsnames.ora'daki TNS alias
EXEC sys.sp_droplinkedsrvlogin @rmtsrvname = N'ORAERP', @locallogin = NULL;
EXEC sys.sp_addlinkedsrvlogin
@rmtsrvname = N'ORAERP',
@useself = N'False',
@locallogin = N'CORP\svc-reporting',
@rmtuser = N'REPORT_RO',
@rmtpassword = N'';
-- Oracle'ın kendi SQL lehçesiyle pass-through sorgu
SELECT *
FROM OPENQUERY(ORAERP,
'SELECT ORDER_ID, ORDER_DATE, TOTAL
FROM ERP.ORDERS
WHERE ORDER_DATE >= DATE ''2026-01-01''');
-- Four-part name: catalog boş, Oracle nesne adları genellikle büyük harf
SELECT TOP (10) * FROM ORAERP..ERP.ORDERS;
Oracle’da OPENQUERY genellikle daha iyi seçimdir. Sorgu Oracle’ın kendi lehçesinde çalışır ve filtrelemeyi Oracle yapar. Four-part name’de ise sorguyu çevirmek ve veri tiplerini eşlemek SQL Server’a kalır; Oracle linked server sorunlarının çoğu da burada başlar.
PostgreSQL, MySQL ve Diğer ODBC Kaynakları
Microsoft, PostgreSQL ya da MySQL için bir OLE DB sağlayıcısı sunmaz. Olağan yol, üreticinin ODBC sürücüsünü, örneğin resmi PostgreSQL ODBC sürücüsünü (psqlODBC) ya da MySQL Connector/ODBC’yi MSDASQL üzerinden kullanmaktır. SQL Server makinesinde 64-bit ODBC Data Source Administrator ile bir System DSN oluşturun ve linked server’ı ona yönlendirin:
-- PostgreSQL ODBC sürücüsüyle (64-bit) oluşturulmuş "PG_CRM" System DSN
EXEC sys.sp_addlinkedserver
@server = N'PGCRM',
@srvproduct = N'PostgreSQL',
@provider = N'MSDASQL',
@datasrc = N'PG_CRM';
-- Login'leri yukarıdaki gibi eşleyin, sonra PostgreSQL'in kendi lehçesiyle sorgulayın
SELECT *
FROM OPENQUERY(PGCRM,
'SELECT customer_id, email, created_at
FROM crm.customers
WHERE created_at >= ''2026-01-01''');
@provstr‘a tam bir ODBC connection string yazmak yerine @datasrc‘ta bir System DSN kullanmayı tercih edin. Microsoft, SQL Server 2022’de (CU 24’ten itibaren) ve SQL Server 2025’te, provider string kullanan MSDASQL linked server’larının sysadmin olmayan login’ler için “Access to the remote server is denied because no login-mapping exists” mesajıyla 7416 hatası verdiği bilinen bir sorunu belgeliyor.
Üçüncü Parti ve Özel Sağlayıcılar
DB2, SAP HANA, bulut veri ambarları ya da şirket içi API’ler gibi sistemler için ticari ya da özel geliştirilmiş OLE DB sağlayıcıları veya ODBC sürücüleri kullanılabilir. SQL Server gerekli arayüzleri uygulayan her OLE DB sağlayıcısıyla çalışır, ancak Microsoft yalnızca kendi varsayılan sağlayıcısıyla test eder; davranış ve destek sağlayıcının üreticisinden gelir. SQL Server’ın bir sağlayıcıyı nasıl kullanacağı, SSMS’te Server Objects → Linked Servers → Providers altında sağlayıcı bazında ayarlanır:
- Allow inprocess: sağlayıcıyı SQL Server sürecinin içinde yükler. Bazı sağlayıcılar buna ihtiyaç duyar; ama varsayılan olarak sağlayıcılar süreç dışında çalışır ve bu, SQL Server’ı sağlayıcıdaki hatalardan korur. Süreç içinde bir sağlayıcı çökmesi tüm instance’ı etkileyeceği için bu seçeneği yalnızca güvendiğiniz ve test ettiğiniz sağlayıcılarda açın.
- Dynamic parameter ve Nested queries: SQL Server’ın parametreli ve iç içe sorguları sağlayıcıya göndermesine izin verir; bu da işin daha fazlasını uzak tarafa taşıyabilir. Yalnızca sağlayıcı destekliyorsa açın.
- Supports ‘Like’ operator:
LIKEkoşullarının uzak tarafta değerlendirilmesine izin verir. - Disallow ad hoc access: sağlayıcıya karşı
OPENROWSETveOPENDATASOURCEkullanımını engeller; böylece yalnızca tanımlı linked server’lar üzerinden kullanılabilir.
SQL Server dışındaki kaynaklarda, kaynak bir SQL Server collation’ıyla eşleşen tek bir collation kullanıyorsa collation name sunucu seçeneğini de ayarlayın; böylece metin karşılaştırmaları öngörülebilir davranır.
PolyBase Ne Zaman Daha Uygun?
Oracle, Teradata, MongoDB ya da generic bir ODBC kaynağından yalnızca okuma yapmanız gerekiyorsa PolyBase’i de değerlendirin. SQL Server 2019’dan beri bu kaynakları, linked server ya da sağlayıcı seçenekleri yönetmeden, T-SQL ile external table olarak sunar. Bu kaynaklar için yalnızca okuma desteği vardır ve PolyBase Query Service’in kurulu olması gerekir; generic ODBC, SQL Server 2025 Linux desteğini ekleyene kadar yalnızca Windows’ta çalışıyordu.
SQL Server 2025: Linked Server’ları Bozan Şifreleme Değişikliği
SQL Server 2025’te MSOLEDBSQL, TDS 8.0 ve TLS 1.3 desteği getiren OLE DB sürücüsünün 19. sürümünü kullanır. Bu sürüm bir varsayılanı da değiştirir: linked server Encrypt değerini belirtmiyorsa bağlantı Encrypt=Mandatory ile açılır ve uzak sunucuda geçerli bir sertifika ister. Bu modda self-signed sertifikalar kabul edilmez.
Upgrade sonrasında yıllardır çalışan linked server’lar birden bağlanamaz hale gelebilir. En iyiden en kötüye dört yol var:
- Uzak sunucuya FQDN’iyle eşleşen, CA imzalı bir sertifika kurun ve
Encrypt=Mandatoryile devam edin ya da TDS 8.0 içinEncrypt=Strictkullanın. - Linked server’ı provider string’de
Encrypt=Optionalile yeniden oluşturun. Bağlanır, ama şifreleme olmadan. TrustServerCertificate=Yesekleyin. Microsoft destekliyor ama sertifika doğrulamasını devre dışı bıraktığı için production’da önermiyor.- Trace flag 17600’ü açın. Linked server tanımlarını henüz değiştiremiyorsanız OLE DB 18 davranışını korur. Bunu geçici bir çözüm olarak görün.
Uyarı
SQL Server 2025’e geçmeden önce tüm linked server’ları listeleyin ve her birini yeni sürücü davranışına karşı test edin. Linked server kullanan Agent job’ları, ETL süreçleri ve raporlar çoğu zaman ancak gece, upgrade penceresi kapandıktan çok sonra hata verir.
Linked Server Güvenliği: Login Eşlemeleri
SQL Server uzak tarafa bağlanırken birinin kimliğiyle giriş yapmak zorundadır. SSMS’teki Security sayfası ve sp_addlinkedsrvlogin bunun kim olacağını belirler:
| Seçenek | Ne olur? | Ne zaman kullanılır? |
|---|---|---|
Login’in kendi kimlik bilgileri (@useself = 'true') |
Her kullanıcı kendi kimliğiyle bağlanır. İki atlamalı (double-hop) Windows login’leri için Kerberos delegation gerekir. | Denetim için en iyisi; uzak sunucu gerçek kullanıcıyı görür. |
| Belirli bir yerel login’i bir uzak login’e eşlemek | Yalnızca o yerel login, verilen uzak kimlik bilgilerini kullanır. | Servis hesapları, ETL ve raporlama job’ları. |
Tüm yerel login’leri tek bir uzak login’e eşlemek (@locallogin = NULL) |
Yerelde oturum açabilen herkes o uzak login’in yetkilerini alır. | Nadiren gerekçelendirilebilir; yalnızca read-only, minimum yetkili bir uzak login ile. |
Kritik
Tüm yerel login’leri asla uzak sunucudaki sa‘ya ya da başka bir sysadmin login’e eşlemeyin. Bu durumda yerel instance’ın her kullanıcısı uzak sunucuda sysadmin olur ve EXEC ... AT çalıştırabilen herkes orada her şeyi yapabilir. Ayrıca sp_addlinkedserver‘ın, her yerel login’in kendi kimlik bilgileriyle bağlandığı varsayılan bir eşleme oluşturduğunu unutmayın. Bunu sp_droplinkedsrvlogin ile silip açık eşlemeler ekleyin; bunu her durumda, özellikle SQL Server dışındaki sağlayıcılarda öneriyoruz.
Eşlemede tutulan kimlik bilgileri sunucu tanımında saklanır; bu yüzden uzak login yalnızca entegrasyonun gerçekten ihtiyaç duyduğu yetkilere sahip olmalıdır. Linked server’lar, yetkili kullanıcılarla aynı yetki gözden geçirmesine dahil edilmelidir; bkz. SQL Server güvenlik rehberimiz.
Linked Server Hangi Güvenlik Modelini Kullanmalı?
Tek bir doğru cevap yoktur; doğru model kimin bağlandığına ve istemci ile uzak sunucu arasında kaç ağ atlaması (hop) bulunduğuna bağlıdır. Bu tabloyu başlangıç noktası olarak kullanın:
| Senaryo | Önerilen model | Gerekenler | Ana risk | Kaynak |
|---|---|---|---|---|
| Servis hesabıyla çalışan raporlar, ETL ve Agent job’ları | Bu tek yerel login’i özel bir uzak login’e eşleyin (@useself = 'False', belirli @locallogin). Uzak login’e yalnızca job’un okuduğu ya da çalıştırdığı yetkileri verin. |
Her entegrasyon için ayrı bir uzak login ve parolasını yenileme süreci. | Uzak parola sunucu tanımında saklanır. Microsoft’un kendi örneği bunun tanımlarda, script’lerde, yedeklerde ve log’larda görünebileceği uyarısını yapar. | Microsoft dokümanı (eşleme davranışı, parola uyarısı); Saha pratiği (entegrasyon başına bir login) |
| Her kullanıcı uzak sunucuda kendi kimliğiyle denetlenmeli; istemci yerel instance ile aynı makinede (tek hop) | Windows pass-through: @useself = 'true' ve Windows Authentication. |
Sağlayıcı Windows Authentication’ı desteklemeli. Tek hop senaryolarında delegation gerekmez. | Kullanıcıların uzak tarafta gerçek yetkilere ihtiyacı olur; yetki gözden geçirmesi büyür. | Microsoft dokümanı |
| Aynı pass-through modeli, ama istemci başka bir makineden bağlanıyor (birden fazla hop) | Kerberos delegation yapılandırılmış Windows pass-through. | Çok hop’ta delegation zorunludur. Tam delegation desteklenir; constrained delegation SQL Server 2017 CU17’den itibaren desteklenir, resource-based constrained delegation desteklenmez. İki SQL Server servis hesabında doğru SPN’ler. | Pass-through’un çalışmamasının en sık nedeni hatalı SPN ya da delegation ayarıdır; Microsoft teşhis için Kerberos Configuration Manager aracını sunar. Sık görülen belirti anonymous logon için login hatasıdır; bu, kimliğin aktarılamadığı anlamına gelir. | Microsoft dokümanı (gereksinimler, araç); Saha pratiği (belirti) |
Herkes için tek ortak login ile “çalışsın yeter” (@locallogin = NULL, SQL login) |
Kaçının. Kaçınılamıyorsa en az yetkili, salt okunur bir uzak login kullanın. | Dokümanda şöyle belirtilir: instance’taki herhangi bir kullanıcı bu bağlamı kullanabilir. | Yetkisi kısıtlı bir yerel kullanıcı bile uzak veriyi okuyabilir, izin varsa yazabilir. Microsoft bunu kötüye kullanım riski olarak belirtir. | Microsoft dokümanı |
Uzak login sa ya da bir sysadmin |
Asla. Bunun yerine sınırlı yetkili bir uzak login oluşturun. | Yok; bu bir anti-pattern’dir. | Linked server’ı kullanabilen herkes fiilen uzak sysadmin olur; rpc out açıksa özellikle. |
Saha pratiği |
En az yetki kontrol listesi (Saha pratiği; Microsoft’un en az yetki önerisiyle uyumlu):
- Linked server’ı script ile oluşturun ve kimin çalıştırabileceğini kısıtlayın. T-SQL ile oluşturmak
ALTER ANY LINKED SERVER(ya dasetupadmin) gerektirir; SSMS penceresiCONTROL SERVERya dasysadminister. rpc out‘u yalnızca gerçektenEXECUTE ... ATya da uzak procedure gerektiren linked server’larda açın.- Uzak login’e okuduğu nesneler üzerinde
SELECTverin. SQL Server 2012 SP1 ve sonrasında bu, optimizer’ın istatistikleri okuması için de yeterlidir. - Makalenin sonundaki denetim sorgusunu düzenli çalıştırın ve her “tüm login’ler” eşlemesini gözden geçirin.
Linked Server Nasıl Sorgulanır?
Bir linked server’a iş göndermenin üç yolu vardır ve çok farklı davranırlar:
-- 1. Four-part name: planı yerel optimizer kurar ve neyin gönderileceğine o karar verir
SELECT o.OrderID, o.OrderDate, o.Total
FROM SALESDB.Sales.dbo.Orders AS o
WHERE o.OrderDate >= '20260101';
-- 2. OPENQUERY: sorgu metninin tamamı uzak sunucuda çalışır
SELECT *
FROM OPENQUERY(SALESDB,
'SELECT OrderID, OrderDate, Total
FROM Sales.dbo.Orders
WHERE OrderDate >= ''20260101''');
-- 3. EXECUTE ... AT: uzak sunucuda herhangi bir batch çalıştırır ("rpc out" seçeneği gerekir)
EXEC ('SELECT OrderID, Total FROM Sales.dbo.Orders WHERE CustomerID = ?', 42) AT SALESDB;
- Four-part name en okunaklı yöntemdir ve yerel tablolarla join edilebilir. İşin ne kadarının uzakta yapılacağına SQL Server karar verir; karmaşık koşullarda ya da join’lerde beklediğinizden çok daha fazla satır çekebilir.
OPENQUERYuzak sunucuda bir pass-through sorgu çalıştırır ve yalnızca ilk sonuç kümesini döndürür. Değişken kabul etmez ve sorgu metni en fazla 8 KB olabilir. Bir değer geçirmek için ifadenin tamamını dinamik SQL olarak oluşturupsp_executesqlile çalıştırın.EXECUTE ... ATparametreleri?yer tutucularıyla kabul eder ve DDL ile stored procedure’ler dahil her türlü batch’i çalıştırabilir. Linked server’darpc out‘un açık olmasını gerektirir.
Linked Server Üzerinden Table-Valued Function Çağırma
Sık karşılaşılan bir sürpriz, uzak table-valued function’ların four-part name ile çağrılamamasıdır. SELECT * FROM SALESDB.Sales.dbo.fn_CustomerOrders(42) şu hatayı verir:
Çözüm, fonksiyonu uzak sunucuda çalıştırıp yalnızca sonucunu geri almaktır:
-- Sabit parametre: OPENQUERY
SELECT *
FROM OPENQUERY(SALESDB, 'SELECT * FROM Sales.dbo.fn_CustomerOrders(42)');
-- Değişken parametre: ? yer tutuculu EXECUTE ... AT
DECLARE @CustomerID int = 42;
CREATE TABLE #orders (OrderID int, OrderDate date, Total decimal(18,2));
INSERT INTO #orders (OrderID, OrderDate, Total)
EXEC ('SELECT OrderID, OrderDate, Total FROM Sales.dbo.fn_CustomerOrders(?)', @CustomerID) AT SALESDB;
SELECT * FROM #orders;
INSERT ... EXEC ... AT bir transaction içinde çalışır. Linked server’ın remote proc transaction promotion seçeneği varsayılan olarak açık olduğundan SQL Server bunu MSDTC üzerinden dağıtık bir transaction’a yükseltmeye çalışabilir. Sunucular arasında MSDTC yapılandırılmamışsa ve dağıtık transaction’a ihtiyacınız yoksa bu linked server için seçeneği kapatın.
Linked Server Performansı
Yavaş linked server sorgularının çoğu tek bir nedene dayanır: ağdan çok fazla satır geçmesi. Birkaç kural yardımcı olur:
- Filtrelemeyi uzak tarafta yapın. Four-part name ile yazılmış bir sorgu yavaşsa execution plan’a bakın. Milyonlarca satır döndüren bir Remote Query ya da Remote Scan operatörü, filtrenin gönderilmediğini gösterir. Filtrelemeyi uzak sunucunun yapması için sorguyu
OPENQUERYile yeniden yazın. - Büyük bir yerel tabloyu büyük bir uzak tabloya doğrudan join etmeyin. Önce küçük, filtrelenmiş uzak kümeyi geçici bir tabloya alın, gerekiyorsa index ekleyin, sonra yerelde join edin.
- Uzak login’in istatistiklere erişebildiğinden emin olun. Optimizer satır sayılarını tahmin etmek için uzak tablonun istatistiklerini kullanır. SQL Server 2012 SP1’den beri bunları okumak için
SELECTyetkisi yeterlidir; daha azıyla planlar kötüleşebilir. collation compatible‘ı yalnızca gerçekten doğruysa açın. İki sunucu gerçekten aynı collation’ı kullanıyorsa karakter karşılaştırmalarının uzak tarafa gönderilmesini sağlar. Yanlış ayarlanırsa hatalı sonuç döndürür.- Timeout’ları ayarlayın.
connect timeoutvequery timeout, takılan bir uzak sunucunun yerel session’ları ve lock’ları süresiz tutmasını engeller.
OPENQUERY mi Four-Part Name mi: Hangi Desen Daha Hızlı?
Hiçbiri her zaman daha hızlı değildir. Farkları işin nerede yapıldığıdır; bu da ağdan kaç satır geçeceğini belirler:
| Desen | İş nerede çalışır | Tipik tuzak | Ne zaman seçilir | Kaynak |
|---|---|---|---|---|
Four-part namesrv.db.schema.table |
Yerel optimizer planı kurar ve uzak sunucuya neyin gönderileceğine karar verir. | Uzağa gönderilmeyen bir filtre ya da join tüm tabloyu getirir; planda büyük satır sayısı olan Remote Query ya da Remote Scan arayın. İstatistiklere erişim yoksa tahminler bozulur. | Küçük uzak tablolar, basit koşullar, küçük bir yerel tabloyla join. | Microsoft dokümanı (istatistik yetkileri); Saha pratiği (plan kontrolü) |
OPENQUERY |
Tüm metin uzak sunucuda, uzak sistemin kendi diyalektiyle çalışır. | Yalnızca ilk sonuç kümesini döndürür ve değişken kabul etmez; bu yüzden değer dinamik SQL ile metne gömülmelidir. Metne koyduğunuz her değeri doğrulayın. | Büyük uzak tablolar, uzak tarafta filtreleme ve toplama, Oracle, PostgreSQL ve SQL Server dışı kaynaklar. | Microsoft dokümanı |
EXECUTE ... AT |
Uzak sunucuda ? parametreli herhangi bir batch. |
rpc out gerektirir. Transaction içinde remote proc transaction promotion yüzünden MSDTC’ye yükseltilebilir. |
Değişken parametreler, uzak table-valued function’lar, uzak procedure’ler ve DDL. | Microsoft dokümanı; Saha pratiği |
| Geçici tabloya alma | Yalnızca filtrelenmiş uzak satırları bir kez çekin, yerelde index’leyin ve yerelde join edin. | tempdb alanı kullanır; alınan veri o anın bir kopyasıdır. | Büyük bir yerel tablo uzak bir tabloyla join edilecekse ya da uzak veri birkaç kez kullanılacaksa. | Saha pratiği |
OPENQUERY‘ye bir değişken geçirmek için ifade dinamik SQL olarak kurulmalıdır:
-- OPENQUERY'ye değer geçirme: ifadeyi dinamik SQL olarak kurun.
-- Değer tiplidir (date), sabit formata çevrilir ve serbest metin olarak eklenmez.
DECLARE @from date = '2026-01-01';
DECLARE @sql nvarchar(max) =
N'SELECT * FROM OPENQUERY(SALESDB, ''SELECT OrderID, Total FROM Sales.dbo.Orders WHERE OrderDate >= '''''
+ CONVERT(char(8), @from, 112) + N''''''')';
EXEC sys.sp_executesql @sql;
Kontrol etmeye değer diğer performans tuzakları (hepsi Saha pratiği): geniş uzak tablolarda SELECT *, iki sunucunun farklı collation kullandığı karakter karşılaştırmaları ve filtre kolonunda uzak index eksikliği. Sonuncusu için OPENQUERY uzak taramayı düzeltmez, çünkü sorguyu yine uzak sunucu çalıştırır.
Bilinmesi Gereken Linked Server Seçenekleri
| Seçenek | Ne işe yarar? |
|---|---|
data access |
Dağıtık sorguları (four-part name, OPENQUERY) açar. |
rpc out |
Linked server’a çağrılara izin verir: uzak stored procedure’ler ve EXECUTE ... AT. |
rpc |
Belirtilen sunucudan gelen RPC’ye izin verir. |
collation compatible |
Karakter karşılaştırmalarının uzak tarafa gönderilmesini sağlar. Yalnızca collation’lar gerçekten eşleşiyorsa kullanın. |
remote proc transaction promotion |
Transaction içindeki uzak procedure çağrılarını MSDTC dağıtık transaction’ına yükseltir. Varsayılan olarak açıktır. |
connect timeout / query timeout |
Bir bağlantı denemesinin ya da uzak sorgunun ne kadar sürebileceğini sınırlar. 0, sunucu geneli varsayılanı kullanır. |
EXEC sys.sp_serveroption N'SALESDB', 'rpc out', 'true';
EXEC sys.sp_serveroption N'SALESDB', 'query timeout', '600';
Sürüm Notları
| Sürüm ya da platform | Bilinmesi gerekenler | Kaynak |
|---|---|---|
| SQL Server 2019 ve öncesi | @provider belirtilmezse SQLNCLI kullanılır. Microsoft bunun yerine MSOLEDBSQL önerir. |
Microsoft dokümanı |
| SQL Server 2022 | Sağlayıcı adını belirtmeniz gerekir; MSOLEDBSQL önerilir. Belirtmemek beklenmedik davranışa yol açabilir. |
Microsoft dokümanı |
| SQL Server 2017 CU17 ve sonrası | Constrained delegation ile pass-through authentication desteklenir. Resource-based constrained delegation desteklenmez. | Microsoft dokümanı |
| SQL Server 2022 (CU24’ten itibaren) ve 2025 | Provider string kullanan MSDASQL linked server’lar, sysadmin olmayan login’ler için 7416 hatasıyla başarısız olabilir. @datasrc içinde System DSN tercih edin. |
Microsoft dokümanı |
| SQL Server 2025 | MSOLEDBSQL, OLE DB Driver 19’u (TDS 8.0 desteği) kullanır. Encrypt belirtmeniz gerekir; başka bir SQL Server instance’ına şifreli bağlantı için geçerli ve CA imzalı bir sertifika gerekir ya da Encrypt=Optional verilir. Trace flag 17600, OLE DB 18 varsayılanlarını korur. |
Microsoft dokümanı |
| Azure SQL Managed Instance ve Azure SQL Database | Linked server’lar Managed Instance’ta kısıtlarla vardır, Azure SQL Database’de yoktur. Managed Instance’ta bir SQL Agent job için belirli yerel login’i sorguyu çalıştırabilen bir uzak login’e eşleyin. | Microsoft dokümanı |
Linked Server’larınızı Denetleyin
Linked server’lar yıllar içinde birikir ve yarısının neden var olduğunu kimse hatırlamaz. Bu sorgu her birini sağlayıcısı, hedefi ve login eşlemeleriyle listeler. local_principal_id değerinin 0 olması, eşlemenin tüm login’lere uygulandığı anlamına gelir:
SELECT s.name AS linked_server,
s.provider,
s.data_source,
s.provider_string,
s.is_rpc_out_enabled,
COALESCE(sp.name, '(all logins)') AS local_login,
ll.uses_self_credential,
ll.remote_name
FROM sys.servers AS s
LEFT JOIN sys.linked_logins AS ll ON ll.server_id = s.server_id
LEFT JOIN sys.server_principals AS sp ON sp.principal_id = ll.local_principal_id
WHERE s.is_linked = 1
ORDER BY s.name, local_login;
Üç şeye bakın: hâlâ SQLNCLI ya da SQLOLEDB kullanan sağlayıcılar, güçlü uzak login’lere yapılmış “tüm login’ler” eşlemeleri ve artık var olmayan sunuculara işaret eden linked server’lar. Linked server’ların sunucu seviyesinde nesneler olduğunu da unutmayın. Bir availability group‘ta veritabanlarıyla birlikte failover yapmazlar; bu yüzden her replikada oluşturun.
Kaynaklar ve Gözden Geçirme Tarihi
Bu makale 19 Ekim 2026 tarihinde aşağıdaki Microsoft Learn sayfalarına karşı kontrol edildi. Saha pratiği olarak etiketlenen ifadeler bizim önerilerimizdir ve bu sayfalarda yazmaz.
- Linked servers (Database Engine)
- Create linked servers
- sp_addlinkedsrvlogin
- sp_addlinkedserver
- OPENQUERY
SQL Server Danışmanlığı
Linked server’larınızı kontrol altına alın
Aryasoft’un kıdemli DBA ekibi linked server’larınızı denetler, riskli login eşlemelerini kaldırır, yavaş dağıtık sorguları iyileştirir ve instance’larınızı SQL Server 2025 sürücü değişikliğine hazırlar.