W SQL Server istnieje ustawienie „dostęp do danych”, które włącza i wyłącza serwer połączony w celu uzyskania dostępu do zapytań rozproszonych. Jeśli kiedykolwiek pojawi się błąd „Serwer nie jest skonfigurowany do dostępu do danych”, prawdopodobnie jest to spowodowane próbą uruchomienia zapytania rozproszonego na serwerze połączonym, który nie jest skonfigurowany do dostępu do danych. Może się to również zdarzyć, gdy spróbujesz uruchomić OPENQUERY()
na twoim lokalnym serwerze.
Możesz użyć sp_serveroption
włączyć lub wyłączyć dostęp do danych na danym serwerze. Jednak możesz chcieć sprawdzić istniejące ustawienia, zanim zaczniesz je zmieniać. Poniższe przykłady pokazują, jak to zrobić.
Przykład 1 – Zapytanie o sys.servers
Widok systemu
Prawdopodobnie najlepszym sposobem sprawdzenia, czy dostęp do danych jest włączony, jest zapytanie o sys.servers
widok katalogu systemowego. Możesz zwrócić wszystkie kolumny lub tylko te, które chcesz zwrócić. Oto przykład zwracania dwóch kolumn:
SELECT name, is_data_access_enabled FROM sys.servers;
Wynik:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
W takim przypadku dostęp do danych jest włączony dla serwera o nazwie Homer , ale nie dla serwera o nazwie sqlserver007 .
Przykład 2 – Uruchom sp_helpserver
Procedura przechowywania w systemie
sp_helpserver
systemowa procedura składowana również poda nam te informacje, chociaż w innym formacie:
EXEC sp_helpserver;
Wynik:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | name | network_name | status | id | collation_name | connect_timeout | query_timeout | |--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------| | sqlserver007 | sqlserver007 | rpc,rpc out,use remote collation | 0 | NULL | 0 | 0 | | Homer | NULL | data access,use remote collation | 1 | NULL | 0 | 0 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Jeśli spojrzysz na status kolumna, zobaczysz, że dostęp do danych znajduje się w wierszu dla Homer , ale nie dla sqlserver007 .
Na którym serwerze mam uruchomić kod?
Musisz uruchomić kod na lokalnym serwer, a nie serwer zdalny. Mam na myśli to, że jeśli sprawdzasz, czy możesz uruchomić zapytania rozproszone na serwerze połączonym, uruchom kod na serwerze, z którego zamierzasz uruchamiać zapytania rozproszone z .
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 aby sprawdzić, czy dostęp do danych jest włączony dla Homer połączony serwer.
Nie muszę przeskakiwać do Homera aby sprawdzić jego ustawienie. W rzeczywistości, jeśli przeskoczę, może to mieć inne ustawienie.
Aby zademonstrować ten punkt, oto, co otrzymam, jeśli porównam wyniki serwera połączonego z rzeczywistym ustawieniem na serwerze zdalnym.
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 ustawienia niż jego odpowiednik z serwera połączonego.
Fakt, że udało mi się pobrać te informacje za pomocą zapytania rozproszonego, potwierdza twierdzenie, że to ustawienie mojego serwera umożliwiło zapytanie rozproszone.