sql >> Databasteknik >  >> RDS >> Sqlserver

Så här fixar du "Server är inte konfigurerad för DATAÅTKOMST" i SQL Server

Felet "Server är inte konfigurerad för DATAÅTKOMST" i SQL Server är ett vanligt fel när man försöker köra en distribuerad fråga mot en server vars dataåtkomstinställning är inaktiverad.

Felet kommer att ha namnet på servern som du försöker komma åt. Till exempel, om ditt servernamn är SQL01, kommer felet att läsa ungefär så här:

Msg 7411, Level 16, State 1, Line 1
Server 'SQL01' is not configured for DATA ACCESS.

"Dataåtkomst" är en inställning som aktiverar och inaktiverar en länkad server för distribuerad frågeåtkomst.

En vanlig orsak till detta fel är när du försöker köra OPENQUERY() mot den lokala servern. Om du verkligen vill köra OPENQUERY() mot servern måste du se till att dataåtkomst är aktiverad för den servern – även om det är din lokala server.

Den här artikeln går igenom ett exempel på att köra en fråga som genererar felet, kontrollera om en server har dataåtkomst aktiverad, aktivera dataåtkomst, kontrollera igen och slutligen köra frågan igen. Om du inte vill gå igenom hela scenariot, scrolla ner till rubriken "Lösningen" nedan. Alternativt, kolla in Hur man aktiverar och inaktiverar dataåtkomst i SQL Server för ett snabbt exempel på att aktivera och inaktivera dataåtkomst.

Kolla också in 2 sätt att kontrollera om dataåtkomst är aktiverad om du bara vill kontrollera inställningen.

Annars, läs vidare – allt tas upp i den här artikeln.

Exempel 1 – Felet

Här är ett exempel på ett scenario som orsakar felet.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultat:

Msg 7411, Level 16, State 1, Line 1
Server 'sqlserver007' is not configured for DATA ACCESS.

I det här fallet försöker jag köra OPENQUERY() mot min egen lokala server som heter sqlserver007 , men det misslyckas, eftersom servern inte har dataåtkomst aktiverad.

Du kanske undrar varför jag kör OPENQUERY() mot min egen server när jag bara kunde anropa den lagrade proceduren lokalt? Det är sant, men i det här fallet returnerar den lagrade proceduren fler kolumner än jag behöver, så jag tänkte att det var lätt nog att bara köra den genom OPENQUERY() så att jag kunde välja de kolumner jag behöver. Doh! Inte så lätt som jag trodde!

Men denna mindre hicka är lätt nog att lösa, så låt oss fortsätta.

Exempel 2 – Kontrollera inställningen för dataåtkomst

Vi kan se om en server har dataåtkomst aktiverad genom att kontrollera sys.servers systemkatalogvy.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultat:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 0                        |
| Homer        | 1                        |
+--------------+--------------------------+

I det här fallet är dataåtkomst aktiverad för servern som heter Homer , men inte för servern som heter sqlserver007 .

Om du är intresserad, sp_helpserver Den systemlagrade proceduren ger oss också denna information:

EXEC sp_helpserver;

Resultat:

+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
| 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               |
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+

Om du tittar i status kolumnen ser du att dataåtkomst ingår i raden för Homer , men inte för sqlserver007 .

Exempel 3 – Lösningen

Så här tillåter du dataåtkomst.

EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'TRUE';

Resultat:

Commands completed successfully.

Exempel 4 – Kontrollera inställningen igen

Nu kan vi kontrollera dataåtkomstinställningen igen.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultat:

+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 1                        |
| Homer        | 1                        |
+--------------+--------------------------+

Nu har min lokala server dataåtkomst aktiverad.

Och så här ser det ut med sp_helpserver :

EXEC sp_helpserver;

Resultat:

+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
| 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               |
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+

Vi kan nu se att dataåtkomst har lagts till under status kolumn.

Exempel 5 – Kör den ursprungliga frågan igen

Nu när vi har aktiverat dataåtkomst, låt oss köra den ursprungliga frågan igen.

SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultat:

+--------------------------+-------------+-------------+------------+
| 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         |
+--------------------------+-------------+-------------+------------+

Den här gången körs den utan fel.

Även om detta exempel använde en OPENQUERY() på min lokala server, skulle samma fix gälla om jag försökte köra en distribuerad fråga mot en (fjärr)länkad server. Oavsett vilket görs ovanstående steg fortfarande på min lokala server (du behöver inte röra fjärrservern).


  1. Escape en sträng i SQL Server så att den är säker att använda i LIKE-uttryck

  2. RMAN-kommandon misslyckas med ORA-00904:"BS".."GUID":ogiltig identifierare

  3. I Apache Spark 2.0.0, är ​​det möjligt att hämta en fråga från en extern databas (istället för att ta hela tabellen)?

  4. Hur man skickar XML som parameter till lagrad procedur i Oracle