sp_addlinkedsrvlogin (Transact-SQL)

Se aplica a: SQL Server

Crea o actualiza una asignación entre un inicio de sesión en la instancia local de SQL Server y una cuenta de seguridad en un servidor remoto.

Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

[ @rmtsrvname = ] N'rmtsrvname'

Nombre de un servidor vinculado al que se aplica la asignación de inicio de sesión. @rmtsrvname es sysname, sin ningún valor predeterminado.

[ @useself = ] 'useself'

Determina si se va a conectar a rmtsrvname suplantando inicios de sesión locales o enviando explícitamente un inicio de sesión y una contraseña. @useself es varchar(8), con un valor predeterminado de true.

  • Un valor de especifica que los inicios de true sesión usan sus propias credenciales para conectarse a @rmtsrvname, con los argumentos @rmtuser y @rmtpassword que se omiten.
  • falseespecifica que los argumentos @rmtuser y @rmtpassword se usan para conectarse a @rmtsrvname para el @locallogin especificado.

Si @rmtuser y @rmtpassword se establecen NULLen , no se usa ningún inicio de sesión o contraseña para conectarse al servidor vinculado.

[ @locallogin = ] N'locallogin'

Inicio de sesión en el servidor local. @locallogin es sysname, con un valor predeterminado de NULL. NULL especifica que esta entrada se aplica a todos los inicios de sesión locales que se conectan a @rmtsrvname. Si no es NULL, @locallogin puede ser un inicio de sesión de SQL Server o una cuenta de Windows. La cuenta de Windows debe tener acceso a SQL Server directamente o a través de la pertenencia a un grupo de Windows.

[ @rmtuser = ] N'rmtuser'

Inicio de sesión remoto usado para conectarse a @rmtsrvname cuando @useself es false. @rmtuser es sysname, con un valor predeterminado de NULL. Cuando el servidor remoto es una instancia de SQL Server que no usa la autenticación de Windows, @rmtuser es un inicio de sesión de SQL Server.

[ @rmtpassword = ] N'rmtpassword'

Contraseña asociada a @rmtuser. @rmtpassword es sysname, con un valor predeterminado de NULL.

Valores de código de retorno

0 (correcto) o 1 (erróneo).

Comentarios

Cuando un usuario inicia la sesión en el servidor local y ejecuta una consulta distribuida que obtiene acceso a una tabla del servidor vinculado, el servidor local debe iniciar la sesión en el servidor vinculado en nombre del usuario para obtener acceso a esa tabla. Use sp_addlinkedsrvlogin para especificar las credenciales que usa el servidor local para iniciar sesión en el servidor vinculado.

Nota:

Para crear los mejores planes de consulta cuando se usa una tabla en un servidor vinculado, el procesador de consultas debe tener estadísticas de distribución de datos del servidor vinculado. Los usuarios con permisos limitados en las columnas de la tabla puede que no tengan permisos suficientes para obtener todas las estadísticas de utilidad, y puede que reciban un plan de consulta menos eficaz y experimenten un bajo rendimiento. Si el servidor vinculado es una instancia de SQL Server, para obtener todas las estadísticas disponibles, el usuario debe poseer la tabla o ser miembro del rol fijo de servidor sysadmin , el rol fijo de base de datos db_owner o el rol fijo de base de datos db_ddladmin en el servidor vinculado. SQL Server 2012 SP1 (11.0.3x) modifica las restricciones de permisos para obtener estadísticas y permite a los usuarios con permiso SELECT acceder a las estadísticas disponibles a través de DBCC SHOW_STATISTICS. Para obtener más información, consulte la sección Permisos de DBCC SHOW_STATISTICS.

Para crear automáticamente una asignación predeterminada entre todos los inicios de sesión del servidor local y los inicios de sesión remotos en el servidor vinculado, ejecute sp_addlinkedserver. La asignación predeterminada indica que SQL Server usa las credenciales de usuario del inicio de sesión local al conectarse al servidor vinculado en nombre del inicio de sesión. Esto equivale a ejecutar sp_addlinkedsrvlogin con establecido true en @useself para el servidor vinculado, sin especificar un nombre de usuario local. Use sp_addlinkedsrvlogin solo para cambiar la asignación predeterminada o para agregar nuevas asignaciones para inicios de sesión locales específicos. Para eliminar la asignación predeterminada o cualquier otra asignación, use sp_droplinkedsrvlogin.

En lugar de tener que usar sp_addlinkedsrvlogin para crear una asignación de inicio de sesión predeterminada, SQL Server puede usar automáticamente las credenciales de seguridad de Windows (nombre de inicio de sesión y contraseña de Windows) de un usuario que emite la consulta para conectarse a un servidor vinculado cuando existen todas las condiciones siguientes:

  • Un usuario está conectado a SQL Server mediante el modo de autenticación de Windows.

  • La delegación de cuentas de seguridad está disponible en el cliente y en el servidor de envío.

  • El proveedor admite el modo de autenticación de Windows; por ejemplo, SQL Server que se ejecuta en Windows.

Nota:

No es necesario habilitar la delegación para escenarios de un solo salto, pero es necesario para escenarios de varios saltos.

Después de que el servidor vinculado haya realizado la autenticación mediante las asignaciones definidas mediante la ejecución sp_addlinkedsrvlogin en la instancia local de SQL Server, los permisos de objetos individuales de la base de datos remota se determinan mediante el servidor vinculado, no el servidor local.

sp_addlinkedsrvlogin no se puede ejecutar desde dentro de una transacción definida por el usuario.

Permisos

Requiere el permiso ALTER ANY LOGIN en el servidor.

Ejemplos

A Conexión de todos los inicios de sesión locales al servidor vinculado mediante sus propias credenciales de usuario

En el ejemplo siguiente se crea una asignación para asegurar que todos los inicios de sesión en el servidor local se conectan a través del servidor vinculado Accounts mediante sus propias credenciales de usuario.

EXEC sp_addlinkedsrvlogin 'Accounts';

Or

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

Nota:

Si hay asignaciones explícitas creadas para inicios de sesión individuales, tienen prioridad sobre cualquier asignación global que pueda existir para ese servidor vinculado.

B. Conexión de un inicio de sesión específico al servidor vinculado mediante credenciales de usuario diferentes

En el ejemplo siguiente se crea una asignación para asegurar que solo el usuario de Windows Domain\Mary se conecta a través del servidor vinculado Accounts mediante el inicio de sesión MaryP y la contraseña d89q3w4u.

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

Precaución

En este ejemplo no se usa la autenticación de Windows. Las contraseñas se transmiten sin cifrar. Las contraseñas pueden ser visibles en las definiciones y scripts de origen de datos que se guardan en el disco, en copias de seguridad y en archivos de registro. No utilice nunca una contraseña de administrador en este tipo de conexión. Solicite a su administrador de red directrices de seguridad específicas para este entorno.

C. Asignación de un inicio de sesión local específico a un inicio de sesión de servidor remoto

En algunos casos, como con Azure SQL Instancia administrada, para ejecutar un trabajo del Agente SQL que ejecuta una consulta de Transact-SQL (T-SQL) en un servidor remoto a través de un servidor vinculado, debe crear una asignación entre un inicio de sesión en el servidor local a un inicio de sesión en el servidor remoto que tenga permiso para ejecutar la consulta de T-SQL. Cuando el trabajo del Agente SQL se conecta al servidor remoto a través del servidor vinculado, ejecuta la consulta T-SQL en el contexto del inicio de sesión remoto, que debe tener los permisos necesarios para ejecutar la consulta T-SQL.

Si va a asignar inicios de sesión para un trabajo del Agente SQL en Azure SQL Instancia administrada, el inicio de sesión local que asigne al inicio de sesión remoto debe ser el propietario del trabajo del Agente SQL, a menos que el trabajo del Agente SQL sea sysadmin, en cuyo caso debe asignar todos los inicios de sesión locales. Para más información, consulte Trabajos del Agente SQL con Azure SQL Instancia administrada.

Ejecute el siguiente comando de ejemplo en el servidor local para asignar el inicio de sesión local al inicio de sesión local_login_name del servidor login_name remoto al conectarse al servidor remote_servervinculado :

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. Asignar todos los inicios de sesión locales a un inicio de sesión de servidor remoto

Si establece locallogin NULLen , puede asignar todos los inicios de sesión locales a un inicio de sesión en el servidor remoto.

Se requiere asignar todos los inicios de sesión locales a un inicio de sesión de servidor remoto al ejecutar un trabajo del Agente SQL de Azure SQL Instancia administrada propiedad de sysadmin que consulta un servidor remoto a través de un servidor vinculado. Para más información, consulte Trabajos del Agente SQL con Azure SQL Instancia administrada. Cuando el trabajo del Agente SQL se conecta al servidor remoto a través del servidor vinculado, ejecuta la consulta T-SQL en el contexto del inicio de sesión remoto, que debe tener los permisos necesarios para ejecutar la consulta T-SQL.

Ejecute el siguiente comando de ejemplo en el servidor local para asignar todos los inicios de sesión locales al inicio de sesión login_name del servidor remoto al conectarse al servidor remote_servervinculado :

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

E. Comprobación de inicios de sesión vinculados

En el ejemplo siguiente se muestran todos los inicios de sesión asignados para un servidor vinculado:

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;