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

Fonctionnement des connexions sur les serveurs liés (exemples T-SQL)

Lors de la configuration d'un serveur lié dans SQL Server, la configuration des connexions peut parfois prêter à confusion. Dans cet article, mon objectif est de fournir un aperçu de haut niveau de la façon dont SQL Server mappe les connexions locales aux connexions distantes sur le serveur lié.

Lorsque vous utilisez sp_addlinkedserver pour créer un serveur lié dans SQL Server, un mappage par défaut entre toutes les connexions sur le serveur local et les connexions distantes sur le serveur lié est automatiquement créé. SQL Server utilise les informations d'identification de la connexion locale lors de la connexion au serveur lié au nom de la connexion.

Ainsi, si votre connexion locale a une connexion correspondante sur le serveur lié, avec les mêmes informations d'identification, et qu'elle dispose des autorisations appropriées, vous pourrez vous connecter à l'aide de votre connexion locale. Il n'est pas nécessaire d'ajouter une connexion pour le serveur lié (en supposant que vous êtes heureux de vous connecter en utilisant votre propre connexion locale).

Mais si votre connexion locale ne le fait pas avoir une connexion correspondante sur le serveur lié (et avec les mêmes informations d'identification), la connexion échouera.

Dans de tels cas, vous pouvez utiliser sp_addlinkedsrvlogin pour créer une connexion pour le serveur lié afin que les connexions locales puissent se connecter au serveur lié même lorsqu'elles n'ont pas de connexion correspondante sur le serveur lié.

Cela peut entraîner l'utilisation de différents utilisateurs sur le serveur lié, selon qu'ils disposent ou non d'une connexion correspondante sur le serveur lié.

Pour les utilisateurs connectés à SQL Server à l'aide du mode d'authentification Windows, SQL Server peut utiliser automatiquement les informations d'identification de sécurité Windows tant que la délégation de compte de sécurité est disponible sur le client et le serveur d'envoi, et que le fournisseur prend en charge le mode d'authentification Windows.

Les exemples de cette page utilisent des connexions SQL Server (ils n'utilisent pas le mode d'authentification Windows). Ces exemples montrent les résultats que j'obtiens lorsque je me connecte à un serveur lié dans différents scénarios à l'aide de connexions SQL Server locales.

Exemple 1 – Serveur lié sans connexion explicite

Je vais d'abord créer un serveur lié appelé Homer, mais je ne créerai aucun identifiant associé.

EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog='Music';

Cela crée automatiquement un mappage par défaut entre toutes les connexions sur le serveur local et les connexions distantes sur le serveur lié.

Je vais maintenant essayer d'exécuter la requête directe suivante sur le serveur lié à l'aide de différentes connexions locales :

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Les résultats de la requête sont les suivants.

sa

Échec de la connexion pour l'utilisateur 'sa'.

Détails de connexion :Il y a une connexion appelée "sa" sur les deux serveurs, mais ils ont des mots de passe différents. Les deux sont membres de l'sysadmin rôle de serveur.

Lisa

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| dbo | Lisa |+----------------+------------------+

Détails de connexion :Il y a une connexion appelée "Lisa" sur les deux serveurs, et ils ont le même mot de passe. Les deux sont membres de l'sysadmin rôle de serveur.

Milhouse

Échec de la connexion pour l'utilisateur 'Milhouse'.

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Apu

Échec de la connexion pour l'utilisateur 'Apu'.

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Exemple 2 – Ajouter une connexion pour le serveur lié

Ensuite, je vais créer une connexion pour le serveur lié.

EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin=NULL, @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd';

Ce login correspond à un login sur le serveur distant, donc un mapping est créé entre eux.

Maintenant, chaque utilisateur exécutera à nouveau la requête suivante :

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Les résultats de la requête sont les suivants.

sa

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Il y a une connexion appelée "sa" sur les deux serveurs, mais ils ont des mots de passe différents. Les deux sont membres de l'sysadmin rôle de serveur.

Lisa

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Il y a une connexion appelée "Lisa" sur les deux serveurs, et ils ont le même mot de passe. Les deux sont membres de l'sysadmin rôle de serveur.

Milhouse

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Apu

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Ainsi, toutes les connexions locales ont pu se connecter au serveur lié. Même les connexions qui n'ont pas de connexion à distance correspondante sur le serveur lié ont pu se connecter. C'est parce qu'ils ont tous utilisé la connexion Maggie. Merci Maggie !

Exemple 3 - Restreindre la connexion

Maintenant, je vais mettre à jour la connexion pour le serveur lié afin qu'il soit limité à Milhouse.

Mais pour ce faire, je dois supprimer le serveur lié et le recréer. Si je ne le fais pas, SQL Server utilisera les mappages existants et j'obtiendrai les mêmes résultats que ci-dessus.

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Musique';EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N'BigStrong#Passw0rd'; 

Donc dans ce cas j'utilise @locallogin='Milhouse' (au lieu de @locallogin=NULL comme dans l'exemple précédent). Cela ajoutera un mappage de connexion pour une seule connexion locale (Milhouse).

Chaque utilisateur exécute à nouveau la requête suivante :

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Les résultats de la requête sont les suivants.

sa

Msg 18456, Niveau 14, État 1, Ligne 1Échec de la connexion pour l'utilisateur 'sa'.

Détails de connexion :Il y a une connexion appelée "sa" sur les deux serveurs, mais ils ont des mots de passe différents. Les deux sont membres de l'sysadmin rôle de serveur.

Lisa

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| dbo | Lisa |+----------------+------------------+

Détails de connexion :Il y a une connexion appelée "Lisa" sur les deux serveurs, et ils ont le même mot de passe. Les deux sont membres de l'sysadmin rôle de serveur.

Milhouse

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Apu

Msg 18456, Niveau 14, État 1, Ligne 1Échec de la connexion pour l'utilisateur 'Apu'.

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Donc, la clé à retenir ici est que même lorsque vous limitez la connexion à une seule connexion locale, cela n'empêche pas les autres connexions locales de se connecter au serveur lié. S'ils ont une connexion correspondante sur le serveur lié, ils pourront y accéder en utilisant leur propre mappage de connexion qui a été créé lorsque sp_addlinkedserver a été exécuté.

Exemple 4 - En fait, limitez-le à une seule connexion

Si vous voulez vraiment le limiter à une seule connexion et pas plus, vous pouvez utiliser sp_droplinkedsrvlogin pour supprimer tous les mappages de connexion que sp_addlinkedserver crée avant d'exécuter sp_addlinkedsrvlogin .

EXEC sp_dropserver 'Homer', 'droplogins';EXEC sp_addlinkedserver @server=N'Homer', @srvproduct=N'', @provider=N'MSOLEDBSQL', @datasrc=N'172.17.0.2', @catalog ='Musique';EXEC sp_droplinkedsrvlogin 'Homer', NULL;EXEC sp_addlinkedsrvlogin @rmtsrvname=N'Homer', @useself=N'FALSE', @locallogin='Milhouse', @rmtuser=N'Maggie', @rmtpassword=N 'BigStrong#Passw0rd';

Maintenant, réexécutons la requête à chaque connexion :

SELECT * FROM OPENQUERY( Homer, 'SELECT CURRENT_USER AS ''CURRENT_USER'', ORIGINAL_LOGIN() AS ''ORIGINAL_LOGIN''');

Les résultats de la requête sont les suivants.

sa

Msg 7416, Niveau 16, État 1, Ligne 1L'accès au serveur distant est refusé car aucun mappage de connexion n'existe.

Détails de connexion :Il y a une connexion appelée "sa" sur les deux serveurs, mais ils ont des mots de passe différents. Les deux sont membres de l'sysadmin rôle de serveur.

Lisa

Msg 7416, Niveau 16, État 1, Ligne 1L'accès au serveur distant est refusé car aucun mappage de connexion n'existe.

Détails de connexion :Il y a une connexion appelée "Lisa" sur les deux serveurs, et ils ont le même mot de passe. Les deux sont membres de l'sysadmin rôle de serveur.

Milhouse

+----------------+------------------+| UTILISATEUR_ACTUEL | ORIGINAL_LOGIN ||----------------+------------------------------|| Maggie | Maggie |+----------------+------------------+

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Apu

Msg 7416, Niveau 16, État 1, Ligne 1L'accès au serveur distant est refusé car aucun mappage de connexion n'existe.

Détails de connexion :Cette connexion est uniquement sur le serveur local. Il n'y a pas de connexion correspondante sur le serveur lié.

Configuration de la connexion à distance

La connexion réussie au serveur lié n'est que la première étape du processus. Une fois connecté, votre capacité à faire des choses sera affectée par les autorisations de l'utilisateur distant auquel votre connexion est mappée.

Par exemple, si Maggie a été créée sur le serveur distant comme ceci :

CREATE LOGIN Maggie WITH PASSWORD ='BigStrong#Passw0rd';USE Music;CREATE USER Maggie FOR LOGIN Maggie;GRANT SELECT ON DATABASE::Music TO Maggie;

Tout ce qu'elle peut faire est d'exécuter SELECT déclarations contre la base de données « Musique ». Par conséquent, toute personne qui se connecte au serveur lié à l'aide de la connexion de Maggie sera limitée à cela.

Il est recommandé de n'accorder que les autorisations requises, mais pas plus.

Documentation officielle

Cet article visait à fournir un aperçu de haut niveau du fonctionnement des connexions avec les serveurs liés. Il y a beaucoup d'autres scénarios que je n'ai pas couverts ici.

Si vous souhaitez en savoir plus, consultez les liens suivants vers la documentation de Microsoft :

  • sp_addlinkedserver
  • sp_addlinkedsrvlogin
  • sp_testlinkedserver
  • sp_droplinkedsrvlogin
  • sp_dropserver
  • OPENQUERY()