📌 Was ist ein Linked Server?
-- Merke: Ein Linked Server ist ein Brückenobjekt in der tempdb, das einen zweiten Datenknoten bekannt macht.
-- Vier-Universen-Notation für verteilte Abfragen
SELECT *
FROM [LinkedServerName].[Datenbank].[Schema].[Tabelle];
⚙️ 1. Linked Server erstellen (SSMS & T‑SQL)
-- *** T‑SQL Variante (bevorzugt für Automatisierung) ***
EXEC master.dbo.sp_addlinkedserver
@server = N'REMOTE_SRV', -- Alias, der im Query verwendet wird
@srvproduct = N'', -- bei MS SQL Server leer lassen
@provider = N'SQLNCLI', -- OLE DB Provider
@datasrc = N'192.168.1.100'; -- IP oder Hostname des Zielservers
-- Anmeldezuordnung (remote Login + Passwort)
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'REMOTE_SRV',
@useself = N'false',
@locallogin = NULL,
@rmtuser = N'remote_user',
@rmtpassword = N'strong_pw';
-- Sicherheitsoptionen: RPC Out aktivieren (um Stored Proc. aufzurufen)
EXEC master.dbo.sp_serveroption
@server = N'REMOTE_SRV',
@optname = N'rpc out',
@optvalue = N'true';
📊 2. Abfragen, Joins & DML über Linked Server
-- *** SELECT vom Remote‑Server ***
SELECT TOP 10 * FROM REMOTE_SRV.SalesDB.dbo.Customers;
-- *** JOIN zwischen lokaler und remote Tabelle ***
SELECT
o.OrderID,
o.CustomerID,
c.CustomerName
FROM LocalDB.dbo.Orders o
INNER JOIN REMOTE_SRV.SalesDB.dbo.Customers c
ON o.CustomerID = c.CustomerID;
-- *** Daten auf remote Server einfügen / ändern ***
INSERT INTO REMOTE_SRV.SalesDB.dbo.Customers (CustomerName, City)
VALUES (N'Musterfirma GmbH', N'Berlin');
UPDATE REMOTE_SRV.SalesDB.dbo.Customers
SET City = N'Hamburg'
WHERE CustomerID = 100;
⚡ 3. OPENQUERY – Pass‑Through für maximale Performance
-- *** Grundlegende OPENQUERY‑Syntax ***
SELECT *
FROM OPENQUERY(REMOTE_SRV,
'SELECT CustomerID, CustomerName, City
FROM SalesDB.dbo.Customers
WHERE City = ''Berlin''');
-- *** INSERT über OPENQUERY (gesamte Zieltabelle im FROM) ***
INSERT INTO OPENQUERY(REMOTE_SRV,
'SELECT CustomerID, CustomerName, City
FROM SalesDB.dbo.Customers WHERE 1=0')
VALUES (201, N'PowerShell AG', N'Frankfurt');
-- *** Daten in lokale Tabelle aus OPENQUERY holen ***
INSERT INTO #TempBerlinerKunden
SELECT * FROM OPENQUERY(REMOTE_SRV,
'SELECT CustomerID, CustomerName
FROM SalesDB.dbo.Customers
WHERE City = ''München''');
📁 4. Remote Stored Procedures ausführen (drei Methoden)
-- Methode 1: Vier‑Teile‑Name (einfach, aber erfordert RPC Out)
EXECUTE REMOTE_SRV.SalesDB.dbo.sp_GetTopCustomers @TopCount = 10;
-- Methode 2: OPENQUERY (für SELECT‑ähnliche SPs ohne Ergebnisparameter)
SELECT *
FROM OPENQUERY(REMOTE_SRV,
'EXEC SalesDB.dbo.sp_GetTopCustomers @TopCount = 5');
-- Methode 3: EXECUTE AT (dynamische, komplexe Batches, auch mit OUTPUT)
DECLARE @RemoteScript NVARCHAR(MAX) =
N'DECLARE @RC INT;
EXEC @RC = SalesDB.dbo.sp_GetCustomerCount @City = ''Berlin'';
SELECT @RC AS ResultCode;';
EXECUTE (@RemoteScript) AT REMOTE_SRV;
🛡️ 5. Sicherheit, Berechtigungen & bewährte Handhabung
-- minimale Berechtigungen: ein dedizierter Remote‑Login mit Read/Write-Einschränkung
CREATE LOGIN linked_user WITH PASSWORD = 'strong!PW';
CREATE USER linked_user FOR LOGIN linked_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON SalesDB.dbo.Customers TO linked_user;
-- Immer nach Möglichkeit Windows‑Authentifizierung mit @useself='true' nutzen
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'REMOTE_SRV', @useself = 'true';
-- Sicherheitsoptionen: Nur notwendige Server‑Optionen aktivieren
EXEC sp_serveroption @server = 'REMOTE_SRV', @optname = 'lazy schema validation', @optvalue = 'true';
• Verwenden Sie eigene, schwachprivilegierte Logins auf dem Zielserver – niemals `sa` oder ein Domain‑Admin‑Konto.
• Aktivieren Sie `RPC Out` nur, wenn Sie tatsächlich gespeicherte Prozeduren aufrufen müssen.
• Schalten Sie die MSDTC‑Unterstützung nur in verteilten Transaktionen an, sonst bleiben Sie im lokalen Transaktionsmodus.
• Testen Sie die Verbindung mit `sp_testlinkedserver`, bevor Sie darauf zugreifen.
🔧 6. Fehlerbehandlung & Werkzeuge
-- Verfügbarkeit des Linked Servers testen
sp_testlinkedserver 'REMOTE_SRV';
-- Liste aller vorhandenen Linked Server + Eigenschaften
SELECT s.name, s.product, s.provider, s.data_source, s.is_linked
FROM sys.servers s
WHERE s.is_linked = 1;
-- Fehler beim Join / OpenQuery: häufig `SET FMTONLY OFF` vergessen
SET FMTONLY OFF;
SELECT * FROM OPENQUERY(REMOTE_SRV, 'SET NOCOUNT ON; EXEC dbo.usp_ComplexReport');