SQL Server ma opcję konfiguracji „dostępu do danych”, która włącza i wyłącza połączony serwer dla dostępu do zapytań rozproszonych.
Jeśli kiedykolwiek pojawi się błąd „Serwer nie jest skonfigurowany do dostępu do danych”, prawdopodobnie będziesz musiał włączyć dostęp do danych dla serwera połączonego, na którym próbujesz uruchomić zapytanie rozproszone. I odwrotnie, może się zdarzyć, że będziesz musiał wyłączyć dostęp do danych.
Aby włączyć lub wyłączyć dostęp do danych, użyj sp_serveroption
systemowa procedura składowana. Wykonaj go na serwerze, z którego zamierzasz uruchamiać zapytania rozproszone. Poniższy przykład pokazuje, jak to zrobić.
Przykład 1 – Włącz dostęp do danych
Oto jak włączyć dostęp do danych.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
W tym przypadku serwer nazywa się sqlserver007
i ustawiłem DATA ACCESS
opcja TRUE
.
Oto bardziej zwięzły sposób na zrobienie tego samego:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Uruchomienie jednego z nich umożliwi dostęp do danych na określonym serwerze połączonym.
Nawiasem mówiąc, określony serwer powiązany może być w razie potrzeby serwerem lokalnym. Nie musi to być serwer zdalny.
Aby sprawdzić ustawienia dostępu do danych, uruchom zapytanie na sys.servers
widok katalogu systemowego.
SELECT name, is_data_access_enabled FROM sys.servers;
Wynik:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Ponownie uruchamiasz to na serwerze lokalnym – nie na serwerze zdalnym.
Przykład 2 – Wyłącz dostęp do danych
Aby wyłączyć dostęp do danych, po prostu ustaw @optvalue
na FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Teraz ponownie sprawdź ustawienie.
SELECT name, is_data_access_enabled FROM sys.servers;
Wynik:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Na którym serwerze mam uruchomić kod?
Uruchom kod na serwerze, z którego zamierzasz uruchamiać zapytania rozproszone.
W moim przykładzie sqlserver007 to nazwa lokalnego serwera i Homer jest serwerem zdalnym/połączonym. Gdybym chciał uruchomić zapytania rozproszone przeciwko Homer , uruchomiłbym kod na sqlserver007 .
Nie muszę przeskakiwać do Homera aby zmienić jego ustawienie. W rzeczywistości może mieć inne ustawienie niż to, które stosuję do sqlserver007 .
Aby zademonstrować ten punkt, oto, co otrzymam, jeśli porównam wyniki serwera połączonego z rzeczywistym ustawieniem na serwerze zdalnym.
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;
Wynik:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
W takim przypadku serwer lokalny ma inne ustawienie niż jego odpowiednik w serwerze połączonym.
A fakt, że udało mi się pobrać te informacje za pomocą zapytania rozproszonego, pokazuje, że to ustawienie mojego serwera umożliwiło zapytanie rozproszone, a nie serwera zdalnego.