sql >> Database teknologi >  >> RDS >> Sqlserver

Sådan rettes "Serveren er ikke konfigureret til DATAADGANG" i SQL Server

Fejlen "Serveren er ikke konfigureret til DATAADGANG" i SQL Server er en almindelig fejl, når man forsøger at køre en distribueret forespørgsel mod en server, hvis indstilling for dataadgang er deaktiveret.

Fejlen vil have navnet på den server, du forsøger at få adgang til. For eksempel, hvis dit servernavn er SQL01, vil fejlen læse noget som dette:

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

"Dataadgang" er en indstilling, der aktiverer og deaktiverer en forbundet server for distribueret forespørgselsadgang.

En almindelig årsag til denne fejl er, når du forsøger at køre OPENQUERY() mod den lokale server. Hvis du virkelig ønsker at køre OPENQUERY() mod serveren, skal du sikre dig, at dataadgang er aktiveret for den server – også selvom det er din lokale server.

Denne artikel gennemgår et eksempel på at køre en forespørgsel, der genererer fejlen, kontrollere om en server har dataadgang aktiveret, aktivere dataadgang, gentjekke og til sidst køre forespørgslen igen. Hvis du ikke vil gennemgå hele scenariet, skal du rulle ned til overskriften "Løsningen" nedenfor. Alternativt kan du se Sådan aktiverer og deaktiverer du dataadgang i SQL Server for et hurtigt eksempel på at aktivere og deaktivere dataadgang.

Tjek også 2 måder at kontrollere, om dataadgang er aktiveret, hvis du bare vil tjekke indstillingen.

Ellers læs videre – det hele er dækket i denne artikel.

Eksempel 1 – Fejlen

Her er et eksempel på et scenarie, der forårsager fejlen.

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 dette tilfælde forsøger jeg at køre OPENQUERY() mod min egen lokale server kaldet sqlserver007 , men det mislykkes, fordi serveren ikke har dataadgang aktiveret.

Du undrer dig måske over, hvorfor jeg kører OPENQUERY() mod min egen server, når jeg bare kunne kalde den lagrede procedure lokalt? Det er sandt, men i dette tilfælde returnerer den lagrede procedure flere kolonner, end jeg har brug for, så jeg regnede med, at det var nemt nok bare at køre det gennem OPENQUERY() så jeg kunne vælge de kolonner, jeg har brug for. Doh! Ikke så let, som jeg troede!

Men dette mindre problem er nemt nok at løse, så lad os fortsætte.

Eksempel 2 – Tjek indstillingen for dataadgang

Vi kan se, om en server har dataadgang aktiveret ved at kontrollere sys.servers systemkatalogvisning.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultat:

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

I dette tilfælde er dataadgang aktiveret for serveren kaldet Homer , men ikke for serveren kaldet sqlserver007 .

Hvis du er interesseret, kan du bruge sp_helpserver den systemlagrede procedure vil også give os disse oplysninger:

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

Hvis du ser i status kolonne, vil du se den dataadgang er inkluderet i rækken for Homer , men ikke for sqlserver007 .

Eksempel 3 – Løsningen

Sådan giver du adgang til data.

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

Resultat:

Commands completed successfully.

Eksempel 4 – Tjek indstillingen igen

Nu kan vi kontrollere dataadgangsindstillingen igen.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultat:

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

Nu har min lokale server dataadgang aktiveret.

Og her er, hvordan det ser ud 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, at dataadgang er blevet tilføjet under status kolonne.

Eksempel 5 – Kør den oprindelige forespørgsel igen

Nu hvor vi har aktiveret dataadgang, lad os køre den oprindelige forespørgsel 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         |
+--------------------------+-------------+-------------+------------+

Denne gang kører den uden fejl.

Selvom dette eksempel brugte en OPENQUERY() til min lokale server, ville den samme rettelse gælde, hvis jeg forsøgte at køre en distribueret forespørgsel mod en (fjern)linket server. Uanset hvad udføres ovenstående trin stadig på min lokale server (ingen grund til at røre ved fjernserveren).


  1. php / Mysql bedste træstruktur

  2. MySQL Great Circle Distance (Haversine formel)

  3. Knee-Jerk Vent-statistikker:SOS_SCHEDULER_YIELD

  4. Sådan opretter du genvej til SSMS og opretter automatisk forbindelse til standard SQL Server - SQ:Server / TSQL Tutorial Del 4