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

2 sposoby sprawdzenia, czy dostęp do danych jest włączony w SQL Server (przykłady T-SQL)

W SQL Server istnieje ustawienie „dostęp do danych”, które włącza i wyłącza serwer połączony w celu uzyskania dostępu do zapytań rozproszonych. Jeśli kiedykolwiek pojawi się błąd „Serwer nie jest skonfigurowany do dostępu do danych”, prawdopodobnie jest to spowodowane próbą uruchomienia zapytania rozproszonego na serwerze połączonym, który nie jest skonfigurowany do dostępu do danych. Może się to również zdarzyć, gdy spróbujesz uruchomić OPENQUERY() na twoim lokalnym serwerze.

Możesz użyć sp_serveroption włączyć lub wyłączyć dostęp do danych na danym serwerze. Jednak możesz chcieć sprawdzić istniejące ustawienia, zanim zaczniesz je zmieniać. Poniższe przykłady pokazują, jak to zrobić.

Przykład 1 – Zapytanie o sys.servers Widok systemu

Prawdopodobnie najlepszym sposobem sprawdzenia, czy dostęp do danych jest włączony, jest zapytanie o sys.servers widok katalogu systemowego. Możesz zwrócić wszystkie kolumny lub tylko te, które chcesz zwrócić. Oto przykład zwracania dwóch kolumn:

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 .

Przykład 2 – Uruchom sp_helpserver Procedura przechowywania w systemie

sp_helpserver systemowa procedura składowana również poda nam te informacje, chociaż w innym formacie:

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 .

Na którym serwerze mam uruchomić kod?

Musisz uruchomić kod na lokalnym serwer, a nie serwer zdalny. Mam na myśli to, że jeśli sprawdzasz, czy możesz uruchomić zapytania rozproszone na serwerze połączonym, uruchom kod na serwerze, z którego zamierzasz uruchamiać zapytania rozproszone z .

W moim przykładzie sqlserver007 to nazwa lokalnego serwera i Homer jest serwerem zdalnym/połączonym. Gdybym chciał uruchomić zapytania rozproszone przeciwko Homer , uruchomiłbym kod na sqlserver007 aby sprawdzić, czy dostęp do danych jest włączony dla Homer połączony serwer.

Nie muszę przeskakiwać do Homera aby sprawdzić jego ustawienie. W rzeczywistości, jeśli przeskoczę, może to mieć inne ustawienie.

Aby zademonstrować ten punkt, oto, co otrzymam, jeśli porównam wyniki serwera połączonego z rzeczywistym ustawieniem na serwerze zdalnym.

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;

Wynik:

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

W takim przypadku serwer lokalny ma inne ustawienia niż jego odpowiednik z serwera połączonego.

Fakt, że udało mi się pobrać te informacje za pomocą zapytania rozproszonego, potwierdza twierdzenie, że to ustawienie mojego serwera umożliwiło zapytanie rozproszone.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Know-How przywracania usuniętych rekordów w SQL Server

  2. T-SQL uzyskuje liczbę dni roboczych między 2 datami

  3. Jak używać klauzuli Where w instrukcji Select w SQL Server — samouczek SQL Server / TSQL, część 109

  4. SQL Server Wyzwalacz do pracy z wstawianiem wielu wierszy

  5. Najlepszy sposób na niszczenie danych XML w kolumnach bazy danych SQL Server