Partage via


sp_addlinkedsrvlogin (Transact-SQL)

S'applique à : SQL Server

Crée ou met à jour un mappage entre une connexion sur l’instance locale de SQL Server et un compte de sécurité sur un serveur distant.

Conventions de la syntaxe Transact-SQL

Syntaxe

sp_addlinkedsrvlogin
    [ @rmtsrvname = ] N'rmtsrvname'
    [ , [ @useself = ] 'useself' ]
    [ , [ @locallogin = ] N'locallogin' ]
    [ , [ @rmtuser = ] N'rmtuser' ]
    [ , [ @rmtpassword = ] N'rmtpassword' ]
[ ; ]

Arguments

[ @rmtsrvname = ] N’rmtsrvname'

Nom d’un serveur lié auquel le mappage de connexion s’applique. @rmtsrvname est sysname, sans valeur par défaut.

[ @useself = ] 'useself'

Détermine s’il faut se connecter à rmtsrvname en empruntant l’identité des connexions locales ou en envoyant explicitement une connexion et un mot de passe. @useself est varchar(8), avec la valeur par défaut true.

  • Valeur de true spécifie que les connexions utilisent leurs propres informations d’identification pour se connecter à @rmtsrvname, avec les arguments @rmtuser et @rmtpassword ignorés.
  • falsespécifie que les arguments @rmtuser et @rmtpassword sont utilisés pour se connecter à @rmtsrvname pour le @locallogin spécifié.

Si @rmtuser et @rmtpassword sont définis NULLsur , aucune connexion ou mot de passe n’est utilisée pour se connecter au serveur lié.

[ @locallogin = ] N’locallogin'

Connexion sur le serveur local. @locallogin est sysname, avec la valeur par défaut NULL. NULL spécifie que cette entrée s’applique à toutes les connexions locales qui se connectent à @rmtsrvname. Si ce n’est pas le cas NULL, @locallogin peut être une connexion SQL Server ou un compte Windows. Le compte Windows doit avoir accès directement à SQL Server ou via l’appartenance à un groupe Windows.

[ @rmtuser = ] N’rmtuser'

Connexion à distance utilisée pour se connecter à @rmtsrvname quand @useself .false @rmtuser est sysname, avec la valeur par défaut NULL. Lorsque le serveur distant est une instance de SQL Server qui n’utilise pas l’authentification Windows, @rmtuser est une connexion SQL Server.

[ @rmtpassword = ] N’rmtpassword'

Mot de passe associé à @rmtuser. @rmtpassword est sysname, avec la valeur par défaut NULL.

Valeurs des codes de retour

0 (réussite) or 1 (échec).

Notes

Lorsqu'un utilisateur accède au serveur local et exécute une requête distribuée qui interroge une table sur le serveur lié, le serveur local doit se connecter au serveur lié à la place de l'utilisateur pour accéder à cette table. Permet sp_addlinkedsrvlogin de spécifier les informations d’identification utilisées par le serveur local pour se connecter au serveur lié.

Remarque

Pour créer les meilleurs plans de requête lorsque vous utilisez une table sur un serveur lié, le processeur de requêtes doit disposer de statistiques de distribution de données à partir du serveur lié. Les utilisateurs qui ont des autorisations limitées sur des colonnes de la table peuvent ne pas avoir d'autorisations suffisantes pour obtenir toutes les statistiques utiles, peuvent recevoir un plan de requête moins efficace et être confrontés à des performances médiocres. Si le serveur lié est une instance de SQL Server, pour obtenir toutes les statistiques disponibles, l’utilisateur doit posséder la table ou être membre du rôle serveur fixe sysadmin , du rôle de base de données fixe db_owner ou du rôle de base de données fixe db_ddladmin sur le serveur lié. SQL Server 2012 SP1 (11.0.3x) modifie les restrictions d’autorisation pour obtenir des statistiques et permet aux utilisateurs disposant d’une autorisation SELECT d’accéder aux statistiques disponibles via dbCC SHOW_STATISTICS. Pour plus d’informations, consultez la section Autorisations de DBCC SHOW_STATISTICS.

Un mappage par défaut entre toutes les connexions sur le serveur local et les connexions distantes sur le serveur lié est automatiquement créé en exécutant sp_addlinkedserver. Le mappage par défaut indique que SQL Server utilise les informations d’identification utilisateur de la connexion locale lors de la connexion au serveur lié pour le compte de la connexion. Cela équivaut à l’exécution sp_addlinkedsrvlogin avec @useself la valeur définie true pour le serveur lié, sans spécifier de nom d’utilisateur local. Utilisez sp_addlinkedsrvlogin uniquement pour modifier le mappage par défaut ou pour ajouter de nouveaux mappages pour des connexions locales spécifiques. Pour supprimer le mappage par défaut ou tout autre mappage, utilisez sp_droplinkedsrvlogin.

Au lieu de devoir utiliser sp_addlinkedsrvlogin pour créer un mappage de connexion prédéterminé, SQL Server peut utiliser automatiquement les informations d’identification de sécurité Windows (nom de connexion et mot de passe Windows) d’un utilisateur qui émet la requête pour se connecter à un serveur lié lorsque toutes les conditions suivantes existent :

  • Un utilisateur est connecté à SQL Server à l’aide du mode d’authentification Windows.

  • La délégation de compte de sécurité est disponible sur le client et le serveur demandeur.

  • Le fournisseur prend en charge le mode d’authentification Windows ; par exemple, SQL Server s’exécutant sur Windows.

Remarque

La délégation n’a pas besoin d’être activée pour les scénarios à tronçon unique, mais elle est requise pour les scénarios à plusieurs tronçons.

Une fois l’authentification effectuée par le serveur lié à l’aide des mappages définis par l’exécution sp_addlinkedsrvlogin sur l’instance locale de SQL Server, les autorisations sur des objets individuels de la base de données distante sont déterminées par le serveur lié, et non par le serveur local.

sp_addlinkedsrvlogin ne peut pas être exécuté à partir d’une transaction définie par l’utilisateur.

autorisations

Nécessite l'autorisation ALTER ANY LOGIN sur le serveur.

Exemples

R. Connecter toutes les connexions locales au serveur lié à l’aide de leurs propres informations d’identification utilisateur

Le code exemple suivant crée un mappage pour que toutes les connexions au serveur local soient établies via le serveur lié Accounts avec leurs propres informations d'identification.

EXEC sp_addlinkedsrvlogin 'Accounts';

Or

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

Remarque

S’il existe des mappages explicites créés pour des connexions individuelles, ils sont prioritaires sur les mappages globaux qui peuvent exister pour ce serveur lié.

B. Connecter une connexion spécifique au serveur lié à l’aide de différentes informations d’identification utilisateur

Le code exemple suivant crée un mappage pour que l'utilisateur Windows Domain\Mary se connecte au serveur lié Accounts en utilisant le nom de connexion MaryP et le mot de passe d89q3w4u.

EXEC sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', 'd89q3w4u';

Attention

Cet exemple n’utilise pas l’authentification Windows. Les mots de passe sont transmis sans être chiffrés. Les mots de passe peuvent être visibles dans les définitions et les scripts de source de données enregistrés sur le disque, dans les sauvegardes et dans les fichiers journaux. N'utilisez jamais le mot de passe d'un administrateur pour ce type de connexion. Consultez votre administrateur réseau pour des conseils de sécurité propres à votre environnement.

C. Mapper une connexion locale spécifique à une connexion de serveur distant

Dans certains cas, par exemple avec Azure SQL Managed Instance, pour exécuter un travail SQL Agent qui exécute une requête Transact-SQL (T-SQL) sur un serveur distant via un serveur lié, vous devez créer un mappage entre une connexion sur le serveur local et une connexion sur le serveur distant qui a l’autorisation d’exécuter la requête T-SQL. Lorsque le travail SQL Agent se connecte au serveur distant via le serveur lié, il exécute la requête T-SQL dans le contexte de la connexion à distance, qui doit disposer des autorisations nécessaires pour exécuter la requête T-SQL.

Si vous mappez des connexions pour un travail SQL Agent dans Azure SQL Managed Instance, la connexion locale que vous mappez à la connexion à distance doit être le propriétaire du travail SQL Agent, sauf si le travail SQL Agent est sysadmin, auquel cas vous devez mapper toutes les connexions locales. Pour plus d’informations, consultez les travaux SQL Agent avec Azure SQL Managed Instance.

Exécutez l’exemple de commande suivant sur le serveur local pour mapper la connexion local_login_name locale au serveur login_name distant lors de la connexion au serveur remote_serverlié :

EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = N’<local_login_name>’,
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>'

D. Mapper toutes les connexions locales à une connexion de serveur distant

En définissant locallogin NULLsur , vous pouvez mapper toutes les connexions locales à une connexion sur le serveur distant.

Le mappage de toutes les connexions locales à une connexion de serveur distant est nécessaire lors de l’exécution d’un travail Sql Managed Instance SQL Agent Appartenant à sysadmin qui interroge un serveur distant via un serveur lié. Pour plus d’informations, consultez les travaux SQL Agent avec Azure SQL Managed Instance. Lorsque le travail SQL Agent se connecte au serveur distant via le serveur lié, il exécute la requête T-SQL dans le contexte de la connexion à distance, qui doit disposer des autorisations nécessaires pour exécuter la requête T-SQL.

Exécutez l’exemple de commande suivant sur le serveur local pour mapper toutes les connexions locales à la connexion login_name au serveur distant lors de la connexion au serveur remote_serverlié :

EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = NULL,
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>'

E. Vérifier les connexions liées

L’exemple suivant montre toutes les connexions qui ont été mappées pour un serveur lié :

SELECT s.name AS server_name, ll.remote_name, sp.name AS principal_name
FROM sys.servers s
INNER JOIN sys.linked_logins ll
    ON s.server_id = ll.server_id
INNER JOIN sys server_principals sp
    ON ll.local_principal_id = sp.principal_id
WHERE s.is_linked = 1;