Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak naprawić „Serwer nie jest skonfigurowany do dostępu do danych” w SQL Server

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).


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. ExecuteScalar vs ExecuteNonQuery podczas zwracania wartości tożsamości

  2. Nieprawidłowa składnia w pobliżu „)” wywołanie procedury składowanej za pomocą GETDATE

  3. Skutecznie rozwiąż problem z bazą danych SQL Server utknął w trybie podejrzanym

  4. SQL Server 2016:zapisywanie wyników zapytania w pliku CSV

  5. Zrozumienie rozmiaru pamięci „datetime2” w SQL Server