sql >> Databáze >  >> RDS >> Sqlserver

Jak opravit „Server není nakonfigurován pro DATA ACCESS“ v SQL Server

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).


  1. O prvku formátu V v Oracle

  2. Zkontrolujte, zda již v PostgreSQL existuje uživatelsky definovaný typ

  3. Spravujte MySQL pomocí phpMyAdmin na Ubuntu 9.10 (Karmic)

  4. Jak otočit protokoly PgBouncer v Linuxu/Windows?