Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen eines Verbindungsservers in SQL Server (T-SQL-Beispiel)

Dieser Artikel enthält ein Beispiel für das Erstellen eines Verbindungsservers in SQL Server mithilfe von Transact-SQL. Mithilfe von T-SQL können Sie den Verbindungsserver erstellen, ohne auf eine grafische Benutzeroberfläche (z. B. SSMS) angewiesen zu sein.

Syntax

Um einen Verbindungsserver mit T-SQL zu erstellen, verwenden Sie sp_addlinkedserver gespeicherte Systemprozedur.

Die offizielle Syntax lautet wie folgt:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

Die meisten Argumente sind optional, aber Sie müssen den Namen des Verbindungsservers angeben.

Wahrscheinlich möchten Sie auch die Datenquelle oder den Standort des verknüpften Servers und vielleicht einen Anbieternamen angeben. Der catalog Mit dem Argument können Sie eine Standarddatenbank angeben, der der Verbindungsserver zugeordnet wird. Sehen Sie sich die offizielle Microsoft-Dokumentation an, um eine Erklärung für jedes dieser Argumente zu erhalten.

Beispiel – Linked Server erstellen

Um einen Verbindungsserver mit T-SQL zu erstellen, führen Sie sp_addlinkedserver aus gespeicherte Prozedur, während der Name des Verbindungsservers sowie seine Quelle übergeben werden.

Hier ist ein Beispiel für die Erstellung eines Verbindungsservers:

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2,1433',
    @catalog='Music';

In diesem Fall lautet der Name des verknüpften Servers „Homer“, und ich gebe die IP-Adresse des Servers an, gefolgt vom TCP-Port (in meinem Fall handelt es sich tatsächlich um einen Docker-Container auf derselben Maschine). Ändern Sie den Servernamen und die IP-Adresse/den Port nach Bedarf. Ich gebe auch eine Standarddatenbank namens „Musik“ an.

Dieses Beispiel verwendet MSOLEDBSQL als Anbietername, aber Sie können einen anderen Anbieternamen verwenden, der in Ihrer Situation anwendbar ist. In meinem Fall verlinke ich auf eine andere Instanz von SQL Server.

Beachten Sie, dass MSOLEDBSQL ist der empfohlene Anbieter für SQL Server. Wenn Sie zuvor SQLOLEDB verwendet haben oder SQLNCLI , beide sind jetzt veraltet. Microsoft hat beschlossen, OLE DB abzulehnen und 2018 zu veröffentlichen.

Wenn Sie auf Oracle verlinken würden, könnten Sie OraOLEDB.Oracle verwenden , für MS Access können Sie Microsoft.Jet.OLEDB.4.0 verwenden (für den Zugriff auf die Formate 2002-2003) oder Microsoft.ACE.OLEDB.12.0 (für das Format 2007). Die offizielle Dokumentation enthält eine Tabelle mit Parametern, die für verschiedene Szenarien verwendet werden können.

Testen Sie den Verbindungsserver

Nachdem Sie den Verbindungsserver hinzugefügt haben, können Sie sp_testlinkedserver verwenden um es zu testen:

EXEC sp_testlinkedserver Homer;

Ergebnis (bei Erfolg):

Commands completed successfully.

Wenn Sie die Fehlermeldung „Anmeldung fehlgeschlagen“ erhalten, haben Sie wahrscheinlich keine entsprechende Anmeldung auf dem Remote-Server. Sie benötigen ein entsprechendes Login mit denselben Anmeldeinformationen wie auf dem lokalen Server.

Wenn Sie den Verbindungsserver zum ersten Mal hinzufügen, wird automatisch eine Standardzuordnung zwischen allen Anmeldungen auf dem lokalen Server und Remote-Anmeldungen auf dem Verbindungsserver erstellt. SQL Server verwendet die Anmeldeinformationen des lokalen Anmeldenamens, wenn im Auftrag des Anmeldenamens eine Verbindung zum Verbindungsserver hergestellt wird. Wenn Ihre lokale Anmeldung keine entsprechende Anmeldung auf dem Remote-Server hat, erhalten Sie die Fehlermeldung „Anmeldung fehlgeschlagen“.

Fügen Sie ein Login für den verknüpften Server hinzu

Wenn Sie nicht möchten, dass der Verbindungsserver Ihr eigenes Login verwendet, können Sie ein anderes Login angeben, das verwendet werden soll. Solange der Remote-Server über ein entsprechendes Login mit denselben Anmeldeinformationen verfügt, können Sie loslegen. Natürlich müssen Sie sicherstellen, dass das Remote-Konto über die entsprechenden Berechtigungen verfügt, um das zu tun, was Sie tun müssen.

Hier ist ein Beispiel für das Hinzufügen einer SQL Server-Anmeldung für den Verbindungsserver.

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Marge', 
    @rmtpassword=N'BigStrong#Passw0rd';

Führen Sie dies auf dem lokalen Server aus, nachdem Sie den Verbindungsserver erstellt haben. Sie benötigen ein entsprechendes Login mit denselben Anmeldeinformationen auf dem tatsächlichen (entfernten) verknüpften Server.

Dadurch wird ein Login namens „Marge“ für den Verbindungsserver namens „Homer“ hinzugefügt. Solange der Remote-Server über ein Login mit denselben Anmeldeinformationen verfügt, kann sich der lokale Server beim Verbindungsserver anmelden.

Ein Beispiel für das Hinzufügen einer entsprechenden Anmeldung auf dem Remoteserver finden Sie unter Hinzufügen einer verknüpften Serveranmeldung in SQL Server.

Einen verknüpften Server löschen

Hier ist ein Beispiel für das Löschen des Verbindungsservers namens „Homer“ und aller zugehörigen Anmeldungen.

EXEC sp_dropserver 'Homer', 'droplogins';

Die droplogins Das Argument ist optional, aber wenn Sie dies nicht angeben, wenn Sie einen Verbindungsserver löschen, der zugeordnete Remote- und Verbindungsserver-Anmeldeeinträge hat oder als Replikationsherausgeber konfiguriert ist, wird eine Fehlermeldung zurückgegeben.

Weitere Beispiele für das Löschen eines Verbindungsservers finden Sie unter Entfernen eines Verbindungsservers mit T-SQL.

Führen Sie eine verteilte Abfrage für den verknüpften Server aus

Nachdem wir nun den Verbindungsserver erstellt haben, ist hier ein Beispiel für die Ausführung einer verteilten Abfrage:

SELECT * 
FROM Homer.Music.dbo.Artists;

Der einzige Unterschied zwischen dieser und einer lokalen Abfrage besteht darin, dass Sie den verknüpften Servernamen zu FROM hinzufügen müssen Klausel.

So:

LinkedServer.Database.Schema.Table

Alternativ können Sie OPENQUERY() verwenden So führen Sie eine Pass-Through-Abfrage aus:

SELECT * 
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM Music.dbo.Artists;'
    );