Błąd „Serwer nie jest skonfigurowany do dostępu do danych” w programie SQL Server jest częstym błędem podczas próby uruchomienia zapytania rozproszonego na serwerze, który ma wyłączone ustawienie dostępu do danych.
Błąd będzie miał nazwę serwera, do którego próbujesz uzyskać dostęp. Na przykład, jeśli nazwa twojego serwera to SQL01, błąd będzie wyglądał mniej więcej tak:
Msg 7411, Level 16, State 1, Line 1 Server 'SQL01' is not configured for DATA ACCESS.
„Dostęp do danych” to ustawienie, które włącza i wyłącza połączony serwer dla dostępu do zapytań rozproszonych.
Częstą przyczyną tego błędu jest próba uruchomienia OPENQUERY()
przeciwko serwerowi lokalnemu. Jeśli naprawdę chcesz uruchomić OPENQUERY()
przeciwko serwerowi, musisz upewnić się, że dostęp do danych jest włączony dla tego serwera – nawet jeśli jest to Twój serwer lokalny.
W tym artykule przedstawiono przykład uruchamiania zapytania, które generuje błąd, sprawdzania, czy serwer ma włączony dostęp do danych, włączania dostępu do danych, ponownego sprawdzania, a na koniec ponownego uruchamiania zapytania. Jeśli nie chcesz przechodzić przez cały scenariusz, przewiń w dół do nagłówka „Rozwiązanie” poniżej. Możesz też zapoznać się z artykułem Jak włączyć i wyłączyć dostęp do danych w programie SQL Server, aby zapoznać się z szybkim przykładem włączania i wyłączania dostępu do danych.
Sprawdź także 2 sposoby sprawdzenia, czy dostęp do danych jest włączony, jeśli chcesz tylko sprawdzić ustawienie.
W przeciwnym razie czytaj dalej – wszystko omówiono w tym artykule.
Przykład 1 – Błąd
Oto przykład scenariusza, który powoduje błąd.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Wynik:
Msg 7411, Level 16, State 1, Line 1 Server 'sqlserver007' is not configured for DATA ACCESS.
W tym przypadku próbuję uruchomić OPENQUERY()
przeciwko mojemu własnemu serwerowi lokalnemu o nazwie
sqlserver007
, ale to się nie udaje, ponieważ serwer nie ma włączonego dostępu do danych.
Być może zastanawiasz się, dlaczego uruchamiam OPENQUERY()
przeciwko mojemu własnemu serwerowi, kiedy mogę po prostu wywołać procedurę składowaną lokalnie? To prawda, ale w tym przypadku procedura składowana zwraca więcej kolumn niż potrzebuję, więc pomyślałem, że wystarczy uruchomić ją przez OPENQUERY()
abym mógł wybrać kolumny, których potrzebuję. Doh! Nie tak proste, jak myślałem!
Ale ta niewielka czkawka jest dość łatwa do rozwiązania, więc kontynuujmy.
Przykład 2 – Sprawdź ustawienia dostępu do danych
Możemy zobaczyć, czy serwer ma włączony dostęp do danych, sprawdzając sys.servers
widok katalogu systemowego.
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 .
Jeśli jesteś zainteresowany, sp_helpserver
systemowa procedura składowana poda nam również te informacje:
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 .
Przykład 3 – Rozwiązanie
Oto jak zezwolić na dostęp do danych.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
Wynik:
Commands completed successfully.
Przykład 4 – Sprawdź ponownie ustawienie
Teraz możemy ponownie sprawdzić ustawienia dostępu do danych.
SELECT name, is_data_access_enabled FROM sys.servers;
Wynik:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Teraz mój lokalny serwer ma włączony dostęp do danych.
A oto jak to wygląda z sp_helpserver
:
EXEC sp_helpserver;
Wynik:
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+ | name | network_name | status | id | collation_name | connect_timeout | query_timeout | |--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------| | sqlserver007 | sqlserver007 | rpc,rpc out,data access,use remote collation | 0 | NULL | 0 | 0 | | Homer | NULL | data access,use remote collation | 1 | NULL | 0 | 0 | +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
Widzimy teraz, że dostęp do danych został dodany pod statusem kolumna.
Przykład 5 – Ponownie uruchom oryginalne zapytanie
Teraz, gdy włączyliśmy dostęp do danych, ponownie uruchommy oryginalne zapytanie.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Wynik:
+--------------------------+-------------+-------------+------------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |--------------------------+-------------+-------------+------------| | CityID | int | 10 | 4 | | CityName | nvarchar | 50 | 100 | | StateProvinceID | int | 10 | 4 | | Location | geography | 2147483647 | 2147483647 | | LatestRecordedPopulation | bigint | 19 | 8 | | LastEditedBy | int | 10 | 4 | | ValidFrom | datetime2 | 27 | 54 | | ValidTo | datetime2 | 27 | 54 | +--------------------------+-------------+-------------+------------+
Tym razem działa bezbłędnie.
Chociaż w tym przykładzie użyto OPENQUERY()
do mojego lokalnego serwera, ta sama poprawka miałaby zastosowanie, gdybym próbował uruchomić rozproszone zapytanie na (zdalnym) serwerze połączonym. Niezależnie od tego powyższe kroki są nadal wykonywane na moim lokalnym serwerze (nie ma potrzeby dotykania zdalnego serwera).