SQL Server má možnost konfigurace „přístup k datům“, která povoluje a zakazuje propojený server pro distribuovaný přístup k dotazům.
Pokud se někdy zobrazí chyba „Server není nakonfigurován pro PŘÍSTUP K DATŮM“, pravděpodobně budete muset povolit přístup k datům pro propojený server, na kterém se pokoušíte spustit distribuovaný dotaz. Naopak mohou nastat situace, kdy budete muset přístup k datům zakázat.
Chcete-li povolit nebo zakázat přístup k datům, použijte sp_serveroption
uložená procedura systému. Spusťte jej na serveru, ze kterého chcete spouštět distribuované dotazy. Následující příklad ukazuje, jak to provést.
Příklad 1 – Povolení přístupu k datům
Zde je návod, jak povolit přístup k datům.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
V tomto případě se server nazývá sqlserver007
a nastavil jsem DATA ACCESS
možnost TRUE
.
Zde je stručnější způsob, jak udělat totéž:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
Spuštění některé z těchto možností umožní přístup k datům na určeném propojeném serveru.
Mimochodem, zadaný propojený server může být v případě potřeby místním serverem. Nemusí to být vzdálený server.
Chcete-li zkontrolovat nastavení přístupu k datům, spusťte dotaz proti sys.servers
zobrazení systémového katalogu.
SELECT name, is_data_access_enabled FROM sys.servers;
Výsledek:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Opět to spustíte proti místnímu serveru – nikoli vzdálenému serveru.
Příklad 2 – Zakázání přístupu k datům
Chcete-li zakázat přístup k datům, jednoduše nastavte @optvalue
na FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Nyní znovu zkontrolujte nastavení.
SELECT name, is_data_access_enabled FROM sys.servers;
Výsledek:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Na kterém serveru spustím kód?
Spusťte kód na serveru, ze kterého chcete spouštět distribuované dotazy.
V mém příkladu sqlserver007 je název místního serveru a Homer je vzdálený/propojený server. Pokud bych chtěl spouštět distribuované dotazy proti Homer , spustil bych kód proti sqlserver007 .
Nepotřebuji přeskakovat na Homer pro změnu jeho nastavení. Ve skutečnosti by mohl mít jiné nastavení než to, které aplikuji na sqlserver007 .
Abych tento bod demonstroval, zde je to, co dostanu, když porovnám výsledky propojeného serveru se skutečným nastavením na vzdáleném serveru.
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;
Výsledek:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
V tomto případě má místní server jiné nastavení než jeho protějšek propojeného serveru.
A skutečnost, že se mi podařilo získat tyto informace prostřednictvím distribuovaného dotazu, ukazuje, že distribuovaný dotaz umožnilo nastavení mého vlastního serveru, nikoli vzdáleného serveru.