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

So aktivieren/deaktivieren Sie den Datenzugriff in SQL Server (T-SQL-Beispiel)

SQL Server verfügt über eine Konfigurationsoption „Datenzugriff“, 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, müssen Sie wahrscheinlich den Datenzugriff für den Verbindungsserver aktivieren, für den Sie versuchen, die verteilte Abfrage auszuführen. Umgekehrt kann es auch vorkommen, dass Sie den Datenzugriff deaktivieren müssen.

Verwenden Sie zum Aktivieren oder Deaktivieren des Datenzugriffs die sp_serveroption System gespeicherte Prozedur. Führen Sie es auf dem Server aus, von dem aus Sie verteilte Abfragen ausführen möchten. Das folgende Beispiel zeigt, wie das geht.

Beispiel 1 – Datenzugriff aktivieren

So aktivieren Sie den Datenzugriff.

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

In diesem Fall heißt der Server sqlserver007 , und ich setze den DATA ACCESS Option auf TRUE .

Hier ist eine prägnantere Möglichkeit, dasselbe zu tun:

sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';

Wenn Sie eines davon ausführen, wird der Datenzugriff auf dem angegebenen Verbindungsserver aktiviert.

Übrigens kann der angegebene Verbindungsserver bei Bedarf auch der lokale Server sein. Es muss kein Remote-Server sein.

Um die Datenzugriffseinstellung zu überprüfen, führen Sie eine Abfrage für sys.servers aus Systemkatalogansicht.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Ergebnis:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 1                        |
| Homer        | 1                        |
+--------------+--------------------------+

Auch hier führen Sie dies auf dem lokalen Server aus – nicht auf dem Remote-Server.

Beispiel 2 – Datenzugriff deaktivieren

Um den Datenzugriff zu deaktivieren, setzen Sie einfach @optvalue auf FALSE .

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

Überprüfen Sie nun erneut die Einstellung.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Ergebnis:

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

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

Führen Sie den Code auf dem Server aus, von dem Sie verteilte Abfragen ausführen möchten.

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 .

Ich muss nicht zu Homer springen seine Einstellung zu ändern. Tatsächlich könnte es eine andere Einstellung haben als die, die ich auf sqlserver007 anwende .

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

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

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 Verbindungsserver-Pendant.

Und die Tatsache, dass ich diese Informationen über eine verteilte Abfrage abrufen konnte, zeigt, dass es die Einstellung meines eigenen Servers war, die die verteilte Abfrage ermöglichte, nicht die des Remote-Servers.