Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So beheben Sie „Server ist nicht für DATENZUGRIFF konfiguriert“ in SQL Server

Der Fehler „Server ist nicht für DATENZUGRIFF konfiguriert“ in SQL Server ist ein häufiger Fehler, wenn versucht wird, eine verteilte Abfrage für einen Server auszuführen, dessen Datenzugriffseinstellung deaktiviert ist.

Der Fehler enthält den Namen des Servers, auf den Sie zugreifen möchten. Wenn Ihr Servername beispielsweise SQL01 lautet, lautet der Fehler etwa so:

Meldung 7411, Ebene 16, Status 1, Zeile 1Server „SQL01“ ist nicht für DATENZUGRIFF konfiguriert.

„Datenzugriff“ ist eine Einstellung, die einen Verbindungsserver für den verteilten Abfragezugriff aktiviert und deaktiviert.

Eine häufige Ursache für diesen Fehler ist, wenn Sie versuchen, OPENQUERY() auszuführen gegen den lokalen Server. Wenn Sie wirklich OPENQUERY() ausführen möchten gegen den Server müssen Sie sicherstellen, dass der Datenzugriff für diesen Server aktiviert ist – auch wenn es Ihr lokaler Server ist.

Dieser Artikel geht durch ein Beispiel für das Ausführen einer Abfrage, die den Fehler generiert, das Überprüfen, ob auf einem Server der Datenzugriff aktiviert ist, das Aktivieren des Datenzugriffs, das erneute Überprüfen und schließlich das erneute Ausführen der Abfrage. Wenn Sie nicht das ganze Szenario durchgehen möchten, scrollen Sie nach unten zur Überschrift „Die Lösung“. Alternativ finden Sie unter How to Enable &Disable Data Access in SQL Server ein kurzes Beispiel zum Aktivieren und Deaktivieren des Datenzugriffs.

Sehen Sie sich auch 2 Möglichkeiten zum Überprüfen, ob der Datenzugriff aktiviert ist an, wenn Sie nur die Einstellung überprüfen möchten.

Ansonsten lesen Sie weiter – alles wird in diesem Artikel behandelt.

Beispiel 1 – Der Fehler

Hier ist ein Beispiel für ein Szenario, das den Fehler verursacht.

SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTHFROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;');

Ergebnis:

Meldung 7411, Ebene 16, Status 1, Zeile 1Server „sqlserver007“ ist nicht für DATENZUGRIFF konfiguriert.

In diesem Fall versuche ich, OPENQUERY() auszuführen gegen meinen eigenen lokalen Server namens sqlserver007 , aber es schlägt fehl, weil der Server keinen Datenzugriff aktiviert hat.

Sie fragen sich vielleicht, warum ich OPENQUERY() ausführe gegen meinen eigenen Server, wenn ich die gespeicherte Prozedur einfach lokal aufrufen könnte? Das stimmt, aber in diesem Fall gibt die gespeicherte Prozedur mehr Spalten zurück, als ich benötige, also dachte ich, es wäre einfach genug, sie einfach durch OPENQUERY() laufen zu lassen damit ich die Spalten auswählen kann, die ich brauche. Doh! Gar nicht so einfach wie ich dachte!

Aber dieses kleine Problem lässt sich leicht lösen, also machen wir weiter.

Beispiel 2 – Überprüfen Sie die Datenzugriffseinstellung

Wir können sehen, ob ein Server Datenzugriff aktiviert hat, indem wir die sys.servers überprüfen Systemkatalogansicht.

SELECT name, is_data_access_enabled FROM sys.servers;

Ergebnis:

+--------------+---------------------+| Name | is_data_access_enabled ||--------------+---------------------|| sqlserver007 | 0 || Homer | 1 |+--------------+---------------------+

In diesem Fall wird der Datenzugriff für den Server namens Homer aktiviert , aber nicht für den Server namens sqlserver007 .

Falls Sie interessiert sind, der sp_helpserver Die gespeicherte Systemprozedur gibt uns auch diese Informationen:

EXEC sp_helpserver;

Ergebnis:

+--------------+------------------------------- ------------------------------------+------+------ -------------+-------------------+---------------- +| Name | Netzwerkname | Zustand | ID | Sortierungsname | connect_timeout | query_timeout ||--------------+------------------------------- +-----------------------------------------------+------+------- -----------+-------------------+-----------------| | sqlserver007 | sqlserver007 | rpc,rpc out,entfernte Sortierung verwenden | 0 | NULL | 0 | 0 || Homer | NULL | Datenzugriff, Remote-Sortierung verwenden | 1 | NULL | 0 | 0 |+-------------+------------------------------- +-----------------------------------------------+------+------- -----------+-------------------+----------------+ 

Schaut man sich den Status an Spalte sehen Sie diesen Datenzugriff ist in der Zeile für Homer enthalten , aber nicht für sqlserver007 .

Beispiel 3 – Die Lösung

So erlauben Sie den Datenzugriff.

EXEC sp_serveroption @server ='sqlserver007', @optname ='DATA ACCESS', @optvalue ='TRUE';

Ergebnis:

Befehle erfolgreich abgeschlossen.

Beispiel 4 – Überprüfen Sie die Einstellung erneut

Jetzt können wir die Datenzugriffseinstellung erneut überprüfen.

SELECT name, is_data_access_enabled FROM sys.servers;

Ergebnis:

+--------------+---------------------+| Name | is_data_access_enabled ||--------------+---------------------|| sqlserver007 | 1 || Homer | 1 |+--------------+---------------------+

Jetzt hat mein lokaler Server den Datenzugriff aktiviert.

Und so sieht es mit sp_helpserver aus :

EXEC sp_helpserver;

Ergebnis:

+--------------+------------------------------- -+---------------------------------------------+- -----+-----+-------------------+----- -------------+| Name | Netzwerkname | Zustand | ID | Sortierungsname | connect_timeout | query_timeout ||--------------+------------------------------- +----------------------------------------------+-- ----+-----------------+------+------ -----------|| sqlserver007 | sqlserver007 | rpc,rpc out,Datenzugriff,Remote-Sortierung verwenden | 0 | NULL | 0 | 0 || Homer | NULL | Datenzugriff, Remote-Sortierung verwenden | 1 | NULL | 0 | 0 |+-------------+------------------------------- +----------------------------------------------+-- ----+-----------------+------+------ -----------+

Wir können jetzt diesen Datenzugriff sehen wurde unter status hinzugefügt Spalte.

Beispiel 5 – Führen Sie die ursprüngliche Abfrage erneut aus

Nachdem wir den Datenzugriff aktiviert haben, führen wir die ursprüngliche Abfrage erneut aus.

SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTHFROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;');

Ergebnis:

+---------------------+------------+----- --------+------------+| COLUMN_NAME | TYPE_NAME | PRÄZISION | LÄNGE ||---------------------+------------+------ -------+------------|| StadtID | int | 10 | 4 || Ortsname | nvarchar | 50 | 100 || StateProvinceID | int | 10 | 4 || Ort | Geographie | 2147483647 | 2147483647 || LatestRecordedPopulation | bigint | 19 | 8 || Zuletzt bearbeitet von | int | 10 | 4 || GültigVon | datumzeit2 | 27 | 54 || Gültig bis | datumzeit2 | 27 | 54 |+---------------------+------------+------ -------+------------+

Diesmal läuft es ohne Fehler.

Obwohl dieses Beispiel ein OPENQUERY() verwendet hat auf meinen lokalen Server, würde derselbe Fix angewendet werden, wenn ich versuchen würde, eine verteilte Abfrage auf einem (entfernten) verknüpften Server auszuführen. Unabhängig davon werden die oben genannten Schritte immer noch auf meinem lokalen Server ausgeführt (keine Notwendigkeit, den Remote-Server zu berühren).