sql >> Database >  >> RDS >> Sqlserver

Hoe te repareren "Server is niet geconfigureerd voor GEGEVENSTOEGANG" in SQL Server

De fout "Server is niet geconfigureerd voor GEGEVENSTOEGANG" in SQL Server is een veelvoorkomende fout bij het uitvoeren van een gedistribueerde query op een server waarvan de instelling voor gegevenstoegang is uitgeschakeld.

De fout heeft de naam van de server waartoe u toegang probeert te krijgen. Als uw servernaam bijvoorbeeld SQL01 is, ziet de fout er ongeveer zo uit:

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

"Gegevenstoegang" is een instelling die een gekoppelde server voor gedistribueerde querytoegang in- en uitschakelt.

Een veelvoorkomende oorzaak van deze fout is wanneer u OPENQUERY() . probeert uit te voeren tegen de lokale server. Als u echt OPENQUERY() . wilt gebruiken tegen de server, moet u ervoor zorgen dat gegevenstoegang is ingeschakeld voor die server, zelfs als het uw lokale server is.

In dit artikel wordt een voorbeeld gegeven van het uitvoeren van een query die de fout genereert, controleren of een server gegevenstoegang heeft ingeschakeld, gegevenstoegang inschakelen, opnieuw controleren en ten slotte de query opnieuw uitvoeren. Als u niet het hele scenario wilt doorlopen, scrolt u omlaag naar de kop 'De oplossing' hieronder. Of bekijk Hoe u gegevenstoegang in SQL Server in- en uitschakelt voor een snel voorbeeld van het in- en uitschakelen van gegevenstoegang.

Bekijk ook 2 manieren om te controleren of gegevenstoegang is ingeschakeld als u alleen de instelling wilt controleren.

Lees anders verder - het wordt allemaal behandeld in dit artikel.

Voorbeeld 1 – De fout

Hier is een voorbeeld van een scenario dat de fout veroorzaakt.

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

Resultaat:

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

In dit geval probeer ik OPENQUERY() . uit te voeren tegen mijn eigen lokale server genaamd sqlserver007 , maar het mislukt, omdat de server geen gegevenstoegang heeft ingeschakeld.

Je vraagt ​​je misschien af ​​waarom ik OPENQUERY() gebruik tegen mijn eigen server terwijl ik de opgeslagen procedure gewoon lokaal kon aanroepen? Dat is waar, maar in dit geval retourneert de opgeslagen procedure meer kolommen dan ik nodig heb, dus ik dacht dat het eenvoudig genoeg was om het gewoon door OPENQUERY() te laten lopen zodat ik de kolommen kon kiezen die ik nodig heb. Doh! Niet zo eenvoudig als ik dacht!

Maar dit kleine probleem is eenvoudig op te lossen, dus laten we doorgaan.

Voorbeeld 2 – Controleer de instelling voor gegevenstoegang

We kunnen zien of een server gegevenstoegang heeft ingeschakeld door de sys.servers . te controleren systeemcatalogusweergave.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultaat:

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

In dit geval is gegevenstoegang ingeschakeld voor de server genaamd Homer , maar niet voor de server genaamd sqlserver007 .

Mocht je geïnteresseerd zijn, de sp_helpserver systeem opgeslagen procedure geeft ons ook deze informatie:

EXEC sp_helpserver;

Resultaat:

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

Als je kijkt in de status kolom, ziet u dat gegevenstoegang is opgenomen in de rij voor Homer , maar niet voor sqlserver007 .

Voorbeeld 3 – De oplossing

Ga als volgt te werk om gegevenstoegang toe te staan.

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

Resultaat:

Commands completed successfully.

Voorbeeld 4 – Controleer de instelling opnieuw

Nu kunnen we de instelling voor gegevenstoegang opnieuw controleren.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultaat:

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

Nu heeft mijn lokale server gegevenstoegang ingeschakeld.

En zo ziet het eruit met sp_helpserver :

EXEC sp_helpserver;

Resultaat:

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

We kunnen nu zien dat gegevenstoegang is toegevoegd onder de status kolom.

Voorbeeld 5 – Voer de oorspronkelijke zoekopdracht opnieuw uit

Nu we gegevenstoegang hebben ingeschakeld, gaan we de oorspronkelijke query opnieuw uitvoeren.

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

Resultaat:

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

Deze keer werkt het zonder fouten.

Hoewel in dit voorbeeld een OPENQUERY() op mijn lokale server, zou dezelfde oplossing van toepassing zijn als ik een gedistribueerde query probeerde uit te voeren op een (externe) gekoppelde server. Hoe dan ook, de bovenstaande stappen worden nog steeds uitgevoerd op mijn lokale server (het is niet nodig om de externe server aan te raken).


  1. Het verzoek is mislukt of de service heeft niet tijdig gereageerd?

  2. SQL afstemmen

  3. Hoe CHARSET() werkt in MariaDB

  4. Android-kamerdatabase exporteert niet alle gegevens