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