SQL Server verfügt über eine Konfigurationsoption „Datenzugriff“, die einen Verbindungsserver für den Zugriff auf verteilte Abfragen aktiviert und deaktiviert.
Wenn Sie jemals den Fehler „Server ist nicht für DATENZUGRIFF konfiguriert“ erhalten, müssen Sie wahrscheinlich den Datenzugriff für den Verbindungsserver aktivieren, für den Sie versuchen, die verteilte Abfrage auszuführen. Umgekehrt kann es auch vorkommen, dass Sie den Datenzugriff deaktivieren müssen.
Verwenden Sie zum Aktivieren oder Deaktivieren des Datenzugriffs die sp_serveroption
System gespeicherte Prozedur. Führen Sie es auf dem Server aus, von dem aus Sie verteilte Abfragen ausführen möchten. Das folgende Beispiel zeigt, wie das geht.
Beispiel 1 – Datenzugriff aktivieren
So aktivieren Sie den Datenzugriff.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
In diesem Fall heißt der Server sqlserver007
, und ich setze den DATA ACCESS
Option auf TRUE
.
Hier ist eine prägnantere Möglichkeit, dasselbe zu tun:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Wenn Sie eines davon ausführen, wird der Datenzugriff auf dem angegebenen Verbindungsserver aktiviert.
Übrigens kann der angegebene Verbindungsserver bei Bedarf auch der lokale Server sein. Es muss kein Remote-Server sein.
Um die Datenzugriffseinstellung zu überprüfen, führen Sie eine Abfrage für sys.servers
aus Systemkatalogansicht.
SELECT name, is_data_access_enabled FROM sys.servers;
Ergebnis:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Auch hier führen Sie dies auf dem lokalen Server aus – nicht auf dem Remote-Server.
Beispiel 2 – Datenzugriff deaktivieren
Um den Datenzugriff zu deaktivieren, setzen Sie einfach @optvalue
auf FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Überprüfen Sie nun erneut die Einstellung.
SELECT name, is_data_access_enabled FROM sys.servers;
Ergebnis:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Auf welchem Server führe ich den Code aus?
Führen Sie den Code auf dem Server aus, von dem Sie verteilte Abfragen ausführen möchten.
In meinem Beispiel sqlserver007 ist der Name des lokalen Servers und Homer ist ein entfernter/verbundener Server. Wenn ich verteilte Abfragen gegen Homer ausführen wollte , würde ich den Code für sqlserver007 ausführen .
Ich muss nicht zu Homer springen seine Einstellung zu ändern. Tatsächlich könnte es eine andere Einstellung haben als die, die ich auf sqlserver007 anwende .
Um diesen Punkt zu demonstrieren, erhalte ich Folgendes, wenn ich die Ergebnisse des Verbindungsservers mit den tatsächlichen Einstellungen auf dem Remote-Server vergleiche.
EXEC sp_serveroption @server = 'Homer', @optname = 'DATA ACCESS', @optvalue = 'TRUE'; SELECT 'From local', is_data_access_enabled FROM sys.servers WHERE name = 'Homer' UNION ALL SELECT 'Remote setting', is_data_access_enabled FROM Homer.master.sys.servers WHERE server_id = 0;
Ergebnis:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
In diesem Fall hat der lokale Server eine andere Einstellung als sein Verbindungsserver-Pendant.
Und die Tatsache, dass ich diese Informationen über eine verteilte Abfrage abrufen konnte, zeigt, dass es die Einstellung meines eigenen Servers war, die die verteilte Abfrage ermöglichte, nicht die des Remote-Servers.