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

2 Möglichkeiten, um zu überprüfen, ob der Datenzugriff in SQL Server aktiviert ist (T-SQL-Beispiele)

In SQL Server gibt es eine „Datenzugriff“-Einstellung, die einen Verbindungsserver für den Zugriff auf verteilte Abfragen aktiviert und deaktiviert. Wenn Sie jemals den Fehler „Server ist nicht für DATENZUGRIFF konfiguriert“ erhalten, liegt das wahrscheinlich daran, dass Sie versuchen, eine verteilte Abfrage auf einem Verbindungsserver auszuführen, der nicht für Datenzugriff konfiguriert ist. Dies kann auch passieren, wenn Sie versuchen, OPENQUERY() auszuführen gegen Ihren lokalen Server.

Sie können sp_serveroption verwenden um den Datenzugriff auf einem bestimmten Server zu aktivieren oder zu deaktivieren. Möglicherweise möchten Sie jedoch die vorhandenen Einstellungen überprüfen, bevor Sie mit der Änderung beginnen. Die folgenden Beispiele zeigen, wie das geht.

Beispiel 1 – Fragen Sie die sys.servers ab Systemansicht

Der wahrscheinlich beste Weg, um zu überprüfen, ob der Datenzugriff aktiviert ist, besteht darin, die sys.servers abzufragen Systemkatalogansicht. Sie können entweder alle Spalten zurückgeben oder nur die, die Sie zurückgeben möchten. Hier ist ein Beispiel für die Rückgabe von zwei Spalten:

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 .

Beispiel 2 – Führen Sie den sp_helpserver aus Gespeicherte Systemprozedur

Der sp_helpserver Die gespeicherte Systemprozedur gibt uns diese Informationen auch, wenn auch in einem anderen Format:

EXEC sp_helpserver;

Ergebnis:

+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
| 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               |
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+

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

Auf welchem ​​Server führe ich den Code aus?

Sie müssen den Code für local ausführen Server, nicht der Remote-Server. Damit meine ich, wenn Sie prüfen, ob Sie verteilte Abfragen auf einem verknüpften Server ausführen können, führen Sie den Code auf dem Server aus, von dem aus Sie verteilte Abfragen ausführen möchten von .

In meinem Beispiel sqlserver007 ist der Name des lokalen Servers und Homer ist ein entfernter/verbundener Server. Wenn ich verteilte Abfragen gegen Homer ausführen wollte , würde ich den Code für sqlserver007 ausführen um zu sehen, ob der Datenzugriff für den Homer aktiviert ist Verbindungsserver.

Ich muss nicht zu Homer springen um seine Einstellung zu überprüfen. Wenn ich tatsächlich überspringe, kann es tatsächlich eine andere Einstellung haben.

Um diesen Punkt zu demonstrieren, erhalte ich Folgendes, wenn ich die Ergebnisse des Verbindungsservers mit den tatsächlichen Einstellungen auf dem Remote-Server vergleiche.

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;

Ergebnis:

+--------------------+--------------------------+
| (No column name)   | is_data_access_enabled   |
|--------------------+--------------------------|
| From local         | 1                        |
| Remote setting     | 0                        |
+--------------------+--------------------------+

In diesem Fall hat der lokale Server eine andere Einstellung als sein Linked-Server-Gegenstück.

Die Tatsache, dass ich diese Informationen über eine verteilte Abfrage abrufen konnte, unterstützt die Behauptung, dass es die Einstellung meines eigenen Servers war, die die verteilte Abfrage ermöglichte.