В SQL Server има настройка „достъп до данни“, която активира и деактивира свързан сървър за достъп до разпределена заявка. Ако някога получите грешката „Сървърът не е конфигуриран за ДОСТЪП ДО ДАННИ“, това вероятно е, защото се опитвате да изпълните разпределена заявка срещу свързан сървър, който не е конфигуриран за достъп до данни. Това може да се случи и когато се опитате да изпълните OPENQUERY()
срещу вашия локален сървър.
Можете да използвате sp_serveroption
за да активирате или деактивирате достъпа до данни на даден сървър. Въпреки това, може да искате да проверите съществуващите настройки, преди да започнете да ги променяте. Следните примери показват как да направите това.
Пример 1 – Запитване на sys.servers
Системен изглед
Вероятно най-добрият начин да проверите дали достъпът до данни е активиран е да потърсите sys.servers
изглед на системния каталог. Можете да върнете всички колони или само тези, които искате да бъдат върнати. Ето пример за връщане на две колони:
SELECT name, is_data_access_enabled FROM sys.servers;
Резултат:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
В този случай достъпът до данни е разрешен за сървъра, наречен Homer , но не и за сървъра, наречен sqlserver007 .
Пример 2 – Изпълнете sp_helpserver
Системна съхранена процедура
sp_helpserver
системната съхранена процедура също ще ни даде тази информация, макар и в различен формат:
EXEC sp_helpserver;
Резултат:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Ако погледнете в статус колона, ще видите, че достъп до данни е включен в реда за Homer , но не и за sqlserver007 .
На кой сървър да стартирам кода?
Трябва да изпълните кода срещу локалния сървър, а не отдалечения сървър. Под това имам предвид, ако проверявате дали можете да изпълнявате разпределени заявки срещу свързан сървър, изпълнете кода срещу сървъра, от който възнамерявате да изпълнявате разпределени заявки от .
В моя пример sqlserver007 е името на локалния сървър и Homer е отдалечен/свързан сървър. Ако исках да изпълнявам разпределени заявки срещу Homer , бих стартирал кода срещу sqlserver007 за да видите дали достъпът до данни е разрешен за Homer свързан сървър.
Няма нужда да прескачам към Homer за да проверите настройката му. Всъщност, ако прескоча, може всъщност да има различна настройка.
За да демонстрирам тази точка, ето какво получавам, ако сравня резултатите от свързания сървър с действителната настройка на отдалечения сървър.
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;
Резултат:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
В този случай локалният сървър има различна настройка от неговия аналог на свързания сървър.
Фактът, че успях да извлека тази информация чрез разпределена заявка, подкрепя твърдението, че настройката на моя собствен сървър е активирала разпределената заявка.