Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment réparer "Le serveur n'est pas configuré pour l'ACCÈS AUX DONNÉES" dans SQL Server

L'erreur "Le serveur n'est pas configuré pour l'accès aux données" dans SQL Server est une erreur courante lors de la tentative d'exécution d'une requête distribuée sur un serveur dont le paramètre d'accès aux données est désactivé.

L'erreur aura le nom du serveur auquel vous essayez d'accéder. Par exemple, si le nom de votre serveur est SQL01, l'erreur ressemblera à ceci :

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

« Accès aux données » est un paramètre qui active et désactive un serveur lié pour l'accès aux requêtes distribuées.

Une cause courante de cette erreur est lorsque vous essayez d'exécuter OPENQUERY() contre le serveur local. Si vous voulez vraiment exécuter OPENQUERY() contre le serveur, vous devrez vous assurer que l'accès aux données est activé pour ce serveur, même s'il s'agit de votre serveur local.

Cet article présente un exemple d'exécution d'une requête qui génère l'erreur, vérifie si l'accès aux données est activé sur un serveur, active l'accès aux données, revérifie et enfin réexécute la requête. Si vous ne voulez pas parcourir tout le scénario, faites défiler jusqu'à la rubrique "La solution" ci-dessous. Vous pouvez également consulter Comment activer et désactiver l'accès aux données dans SQL Server pour un exemple rapide d'activation et de désactivation de l'accès aux données.

Consultez également 2 façons de vérifier si l'accès aux données est activé si vous souhaitez simplement vérifier le paramètre.

Sinon, lisez la suite - tout est couvert dans cet article.

Exemple 1 - L'erreur

Voici un exemple de scénario qui provoque l'erreur.

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

Résultat :

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

Dans ce cas, j'essaie d'exécuter OPENQUERY() contre mon propre serveur local appelé sqlserver007 , mais cela échoue, car l'accès aux données n'est pas activé sur le serveur.

Vous vous demandez peut-être pourquoi j'utilise OPENQUERY() contre mon propre serveur alors que je pouvais simplement appeler la procédure stockée localement ? C'est vrai, mais dans ce cas, la procédure stockée renvoie plus de colonnes que nécessaire, donc j'ai pensé qu'il était assez facile de simplement l'exécuter via OPENQUERY() afin que je puisse choisir les colonnes dont j'ai besoin. Oh ! Pas aussi simple que je le pensais !

Mais ce problème mineur est assez facile à résoudre, alors continuons.

Exemple 2 - Vérifier le paramètre d'accès aux données

Nous pouvons voir si un serveur a un accès aux données activé en vérifiant le sys.servers vue du catalogue système.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Résultat :

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

Dans ce cas, l'accès aux données est activé pour le serveur appelé Homer , mais pas pour le serveur appelé sqlserver007 .

Si vous êtes intéressé, le sp_helpserver La procédure stockée du système nous fournira également ces informations :

EXEC sp_helpserver;

Résultat :

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

Si vous regardez dans le statut colonne, vous verrez que l'accès aux données est inclus dans la ligne pour Homer , mais pas pour sqlserver007 .

Exemple 3 - La solution

Voici comment autoriser l'accès aux données.

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

Résultat :

Commands completed successfully.

Exemple 4 - Revérifier le réglage

Nous pouvons maintenant revérifier le paramètre d'accès aux données.

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Résultat :

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

L'accès aux données est maintenant activé sur mon serveur local.

Et voici à quoi cela ressemble avec sp_helpserver :

EXEC sp_helpserver;

Résultat :

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

Nous pouvons maintenant voir que l'accès aux données a été ajouté sous le statut colonne.

Exemple 5 :Réexécuter la requête d'origine

Maintenant que nous avons activé l'accès aux données, réexécutons la requête d'origine.

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

Résultat :

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

Cette fois, il s'exécute sans erreur.

Bien que cet exemple utilise un OPENQUERY() sur mon serveur local, le même correctif s'appliquerait si j'essayais d'exécuter une requête distribuée sur un serveur lié (distant). Quoi qu'il en soit, les étapes ci-dessus sont toujours effectuées sur mon serveur local (pas besoin de toucher au serveur distant).