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

2 façons de vérifier si l'accès aux données est activé dans SQL Server (exemples T-SQL)

Dans SQL Server, il existe un paramètre "accès aux données" qui active et désactive un serveur lié pour l'accès aux requêtes distribuées. Si vous obtenez l'erreur "Le serveur n'est pas configuré pour l'accès aux données", c'est probablement parce que vous essayez d'exécuter une requête distribuée sur un serveur lié qui n'est pas configuré pour l'accès aux données. Cela peut également se produire lorsque vous essayez d'exécuter OPENQUERY() contre votre serveur local.

Vous pouvez utiliser sp_serveroption pour activer ou désactiver l'accès aux données sur un serveur donné. Toutefois, vous souhaiterez peut-être vérifier les paramètres existants avant de commencer à les modifier. Les exemples suivants montrent comment procéder.

Exemple 1 – Interroger le sys.servers Vue système

La meilleure façon de vérifier si l'accès aux données est activé est probablement d'interroger le sys.servers vue du catalogue système. Vous pouvez soit renvoyer toutes les colonnes, soit uniquement celles que vous souhaitez renvoyer. Voici un exemple de renvoi de deux colonnes :

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 .

Exemple 2 – Exécuter le sp_helpserver Procédure stockée système

Le sp_helpserver La procédure stockée du système nous fournira également ces informations, bien que dans un format différent :

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 .

Sur quel serveur dois-je exécuter le code ?

Vous devez exécuter le code sur le local serveur, pas le serveur distant. Je veux dire par là, si vous vérifiez si vous pouvez exécuter des requêtes distribuées sur un serveur lié, exécutez le code sur le serveur sur lequel vous avez l'intention d'exécuter des requêtes distribuées depuis .

Dans mon exemple, sqlserver007 est le nom du serveur local et Homer est un serveur distant/lié. Si je voulais exécuter des requêtes distribuées sur Homer , j'exécuterais le code sur sqlserver007 pour voir si l'accès aux données est activé pour le Homer serveur lié.

Je n'ai pas besoin de passer à Homer pour vérifier son réglage. En fait, si je saute par-dessus, il se peut que le réglage soit différent.

Pour illustrer ce point, voici ce que j'obtiens si je compare les résultats du serveur lié avec le paramètre réel sur le serveur distant.

SELECT 
  'From local',
  is_data_access_enabled 
FROM sys.servers
WHERE name = 'Homer'
UNION ALL
SELECT 
  'Remote setting',
  is_data_access_enabled 
FROM Homer.master.sys.servers
WHERE server_id = 0;

Résultat :

+--------------------+--------------------------+
| (No column name)   | is_data_access_enabled   |
|--------------------+--------------------------|
| From local         | 1                        |
| Remote setting     | 0                        |
+--------------------+--------------------------+

Dans ce cas, le serveur local a un paramètre différent de son homologue de serveur lié.

Le fait que j'ai pu récupérer ces informations via une requête distribuée confirme l'affirmation selon laquelle c'est le paramètre de mon propre serveur qui a activé la requête distribuée.