Chyba „Server není nakonfigurován pro PŘÍSTUP K DATŮM“ na serveru SQL je běžnou chybou při pokusu o spuštění distribuovaného dotazu na serveru, který má zakázáno nastavení přístupu k datům.
Chyba bude obsahovat název serveru, ke kterému se pokoušíte přistupovat. Pokud je například název vašeho serveru SQL01, chyba bude vypadat takto:
Msg 7411, Level 16, State 1, Line 1 Server 'SQL01' is not configured for DATA ACCESS.
„Přístup k datům“ je nastavení, které povoluje a zakazuje propojený server pro přístup s distribuovanými dotazy.
Běžnou příčinou této chyby je, když se pokusíte spustit OPENQUERY()
proti místnímu serveru. Pokud opravdu chcete spustit OPENQUERY()
vůči serveru, budete muset zajistit, aby byl pro tento server povolen přístup k datům – i když je to váš lokální server.
Tento článek vás provede příkladem spuštění dotazu, který generuje chybu, kontroly, zda má server povolený přístup k datům, povolení přístupu k datům, opětovné kontroly a nakonec opětovného spuštění dotazu. Pokud nechcete procházet celým scénářem, přejděte dolů na nadpis „Řešení“ níže. Případně se podívejte na Jak povolit a zakázat přístup k datům v SQL Server, kde najdete rychlý příklad povolení a zakázání přístupu k datům.
Podívejte se také na 2 způsoby, jak zkontrolovat, zda je povolen přístup k datům, pokud chcete pouze zkontrolovat nastavení.
Jinak čtěte dál – vše je popsáno v tomto článku.
Příklad 1 – Chyba
Zde je příklad scénáře, který způsobuje chybu.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Výsledek:
Msg 7411, Level 16, State 1, Line 1 Server 'sqlserver007' is not configured for DATA ACCESS.
V tomto případě se pokouším spustit OPENQUERY()
proti mému vlastnímu místnímu serveru s názvem
sqlserver007
, ale selže, protože server nemá povolený přístup k datům.
Možná se divíte, proč spouštím OPENQUERY()
proti mému vlastnímu serveru, když jsem mohl volat uloženou proceduru lokálně? To je pravda, ale v tomto případě uložená procedura vrací více sloupců, než potřebuji, takže jsem si myslel, že je dost snadné ji spustit pomocí OPENQUERY()
abych si mohl vybrat sloupce, které potřebuji. Doh! Není to tak snadné, jak jsem si myslel!
Ale tento menší zádrhel se dá snadno vyřešit, takže pokračujme.
Příklad 2 – Zkontrolujte nastavení přístupu k datům
Zda má server povolený přístup k datům, můžeme zjistit kontrolou sys.servers
zobrazení systémového katalogu.
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 .
V případě zájmu sp_helpserver
systémová uložená procedura nám také poskytne tyto informace:
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 .
Příklad 3 – Řešení
Zde je návod, jak povolit přístup k datům.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
Výsledek:
Commands completed successfully.
Příklad 4 – Znovu zkontrolujte nastavení
Nyní můžeme znovu zkontrolovat nastavení přístupu k datům.
SELECT name, is_data_access_enabled FROM sys.servers;
Výsledek:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Nyní má můj místní server povolený přístup k datům.
A takhle to vypadá s sp_helpserver
:
EXEC sp_helpserver;
Výsledek:
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+ | name | network_name | status | id | collation_name | connect_timeout | query_timeout | |--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------| | sqlserver007 | sqlserver007 | rpc,rpc out,data access,use remote collation | 0 | NULL | 0 | 0 | | Homer | NULL | data access,use remote collation | 1 | NULL | 0 | 0 | +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
Nyní vidíme, že přístup k datům byl přidán pod stav sloupec.
Příklad 5 – Spusťte znovu původní dotaz
Nyní, když jsme povolili přístup k datům, spusťte znovu původní dotaz.
SELECT COLUMN_NAME, TYPE_NAME, PRECISION, LENGTH FROM OPENQUERY ( sqlserver007, 'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;' );
Výsledek:
+--------------------------+-------------+-------------+------------+ | COLUMN_NAME | TYPE_NAME | PRECISION | LENGTH | |--------------------------+-------------+-------------+------------| | CityID | int | 10 | 4 | | CityName | nvarchar | 50 | 100 | | StateProvinceID | int | 10 | 4 | | Location | geography | 2147483647 | 2147483647 | | LatestRecordedPopulation | bigint | 19 | 8 | | LastEditedBy | int | 10 | 4 | | ValidFrom | datetime2 | 27 | 54 | | ValidTo | datetime2 | 27 | 54 | +--------------------------+-------------+-------------+------------+
Tentokrát to běží bez chyby.
Ačkoli tento příklad používal OPENQUERY()
na můj místní server by se stejná oprava použila, pokud bych se pokoušel spustit distribuovaný dotaz proti (vzdálenému) propojenému serveru. Bez ohledu na to se výše uvedené kroky stále provádějí na mém místním serveru (není třeba se dotýkat vzdáleného serveru).