SQL Server linked server: two servers joined by a locked chain, representing a secure linked server connection

SQL Server Linked Server: Kurulum, Güvenlik, Sorgulama ve SQL Server 2025 Değişikliği

SQL Server linked server’ı güvenle kurma ve yönetme: login eşleme, Kerberos delegation, OPENQUERY ile four-part name farkı, sürüm notları ve SQL Server 2025 şifreleme değişikliği.

Nisan 19, 2023

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:

  • MSOLEDBSQL ve açıkça belirtilmiş Encrypt ayarı 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 OPENQUERY ya 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.

SQL Server Danışmanlığı

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.

Destek Alın

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: LIKE koşullarının uzak tarafta değerlendirilmesine izin verir.
  • Disallow ad hoc access: sağlayıcıya karşı OPENROWSET ve OPENDATASOURCE kullanı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=Mandatory ile devam edin ya da TDS 8.0 için Encrypt=Strict kullanın.
  • Linked server’ı provider string’de Encrypt=Optional ile yeniden oluşturun. Bağlanır, ama şifreleme olmadan.
  • TrustServerCertificate=Yes ekleyin. 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 da setupadmin) gerektirir; SSMS penceresi CONTROL SERVER ya da sysadmin ister.
  • rpc out‘u yalnızca gerçekten EXECUTE ... AT ya da uzak procedure gerektiren linked server’larda açın.
  • Uzak login’e okuduğu nesneler üzerinde SELECT verin. 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.
  • OPENQUERY uzak 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şturup sp_executesql ile çalıştırın.
  • EXECUTE ... AT parametreleri ? yer tutucularıyla kabul eder ve DDL ile stored procedure’ler dahil her türlü batch’i çalıştırabilir. Linked server’da rpc 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:

▤ Messages

Msg 4122, Level 16, State 1, Line 1
Remote table-valued function calls are not allowed.

Çö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 OPENQUERY ile 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 SELECT yetkisi 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 timeout ve query 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 name
srv.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.

Linked server, bir SQL Server instance’ının başka bir SQL Server, Azure SQL Managed Instance ya da Oracle gibi bir veri kaynağından OLE DB sağlayıcısı üzerinden veri okumasını ve orada komut çalıştırmasını sağlayan bir tanımdır. Four-part name, OPENQUERY ya da EXECUTE … AT ile sorgulanır.
Microsoft OLE DB Driver for SQL Server, yani MSOLEDBSQL kullanın. SQL Server Native Client SQL Server 2022’de kaldırıldı; eski SQLOLEDB sağlayıcısı da yeni çalışmalar için önerilmiyor.
SQL Server 2025, varsayılan olarak Encrypt=Mandatory kullanan ve uzak sunucuda geçerli, güvenilir bir sertifika isteyen OLE DB 19 sürücüsünü kullanır. CA imzalı bir sertifika kurun ya da linked server’ı açık bir Encrypt ayarıyla yeniden oluşturun. Trace flag 17600, eski davranışı geçici bir çözüm olarak geri getirir.
Four-part name ile uzak table-valued function çağrılamaz ve 4122 hatası alınır. Sabit bir çağrı için OPENQUERY, değişken geçirmeniz gerekiyorsa EXECUTE (‘SELECT * FROM dbo.fn(?)’, @deger) AT linked_server kullanın.
Evet. Oracle için SQL Server makinesine Oracle Provider for OLE DB’yi (OraOLEDB.Oracle) kurun ve veri kaynağı olarak bir TNS alias kullanın. PostgreSQL ya da MySQL için üreticinin 64-bit ODBC sürücüsünü kurun, bir System DSN oluşturun ve MSDASQL sağlayıcısını kullanın. Her iki durumda da uzak sistemin kendi SQL lehçesiyle OPENQUERY kullanmak genellikle en güvenilir yoldur.
Hayır. Linked server’lar SQL Server’da ve bazı kısıtlamalarla Azure SQL Managed Instance’ta vardır, ama Azure SQL Database’de yoktur.
Genellikle ağdan çok fazla satır geçtiği için: filtre uzak sunucuya gönderilmiyordur ya da büyük bir uzak tablo doğrudan yerel bir tabloyla join ediliyordur. Planda Remote Query ya da Remote Scan operatörlerine bakın ve filtrelemeyi OPENQUERY ile uzak tarafa taşıyın.
Her zaman değil. OPENQUERY tüm sorguyu uzak sunucuya gönderir; bu yüzden four-part name büyük bir tabloyu ağdan çekecekse genellikle daha hızlıdır. Küçük tablolarda ve basit koşullarda four-part name yeterlidir ve daha okunaklıdır. Karar vermek için planda Remote Query ve Remote Scan operatörlerine bakın.
Yalnızca birden fazla hop üzerinden Windows pass-through authentication için, örneğin istemci başka bir makineden bağlanıyorsa. Microsoft, tek hop senaryolarında delegation gerekmediğini belirtir. Belirli bir login’i uzak login’e eşlerseniz delegation devreye girmez.
Yalnızca entegrasyonun ihtiyaç duyduklarına: genellikle okuduğu nesneler üzerinde SELECT. sa ya da başka bir sysadmin login’i asla kullanmayın. SELECT yetkisi, SQL Server 2012 SP1 ve sonrasında optimizer’ın istatistikleri okuması için de yeterlidir.

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.

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.

4.7/5