V SQL Server je nastavení „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“, je to pravděpodobně proto, že se pokoušíte spustit distribuovaný dotaz na propojeném serveru, který není nakonfigurován pro přístup k datům. To se také může stát, když se pokusíte spustit OPENQUERY()
proti vašemu místnímu serveru.
Můžete použít sp_serveroption
povolit nebo zakázat přístup k datům na daném serveru. Možná však budete chtít zkontrolovat stávající nastavení, než je začnete měnit. Následující příklady ukazují, jak to udělat.
Příklad 1 – Dotaz na sys.servers
Systémové zobrazení
Pravděpodobně nejlepší způsob, jak zkontrolovat, zda je povolen přístup k datům, je dotaz na sys.servers
zobrazení katalogu systému. Můžete buď vrátit všechny sloupce, nebo jen ty, které chcete vrátit. Zde je příklad vrácení dvou sloupců:
SELECT name, is_data_access_enabled FROM sys.servers;
Výsledek:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
V tomto případě je povolen přístup k datům pro server s názvem Homer , ale ne pro server s názvem sqlserver007 .
Příklad 2 – Spusťte sp_helpserver
Uložená procedura systému
sp_helpserver
systémová uložená procedura nám také poskytne tyto informace, i když v jiném formátu:
EXEC sp_helpserver;
Výsledek:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Pokud se podíváte do stavu ve sloupci přístup k datům je zahrnuta v řádku pro Homer , ale ne pro sqlserver007 .
Na kterém serveru spustím kód?
Musíte spustit kód proti místnímu server, nikoli vzdálený server. Tím mám na mysli, že pokud kontrolujete, zda můžete spouštět distribuované dotazy na propojeném serveru, spusťte kód na serveru, ze kterého chcete distribuované dotazy spouštět ze .
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 a zjistěte, zda je pro Homer povolen přístup k datům propojený server.
Nepotřebuji přeskakovat na Homer pro kontrolu jeho nastavení. Ve skutečnosti, když přeskočím, může to mít ve skutečnosti jiné nastavení.
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.
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.
Skutečnost, že se mi podařilo získat tyto informace prostřednictvím distribuovaného dotazu, podporuje tvrzení, že distribuovaný dotaz umožnilo nastavení mého vlastního serveru.