Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Crea o actualiza un mapeo 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
Syntax
sp_addlinkedsrvlogin
[ @rmtsrvname = ] N'rmtsrvname'
[ , [ @useself = ] 'useself' ]
[ , [ @locallogin = ] N'locallogin' ]
[ , [ @rmtuser = ] N'rmtuser' ]
[ , [ @rmtpassword = ] N'rmtpassword' ]
[ ; ]
Arguments
[ @rmtsrvname = ] N'rmtsrvname'
El nombre de un servidor vinculado al que se aplica el mapeo de inicio de sesión. @rmtsrvname es sysname, sin predeterminado.
[ @useself = ] 'usar a sí mismo'
Determina si conectarse a rmtsrvname suplantando inicios de sesión locales o enviando explícitamente un inicio de sesión y contraseña.
@useself es varchar(8), con un valor por defecto de true.
- Un valor de
trueespecifica que los inicios de sesión usan sus propias credenciales para conectarse a @rmtsrvname, ignorando los argumentos @rmtuser y @rmtpassword . -
falseespecifica que los argumentos @rmtuser y @rmtpassword se usan para conectar con @rmtsrvname para el @locallogin especificado.
Si @rmtuser y @rmtpassword están configurados en NULL, no se utiliza ningún usuario ni contraseña para conectarse al servidor vinculado.
[ @locallogin = ] N'local login'
Un inicio de sesión en el servidor local.
@locallogin es sysname, con un valor por defecto de NULL.
NULL Especifica que esta entrada se aplica a todos los inicios de sesión locales que se conectan a @rmtsrvname. Si no, NULL@locallogin puede ser un inicio de sesión de SQL Server o una cuenta de Windows. La cuenta de Windows debe tener acceso directo a SQL Server o mediante la pertenencia a un grupo de Windows.
[ @rmtuser = ] N'rmtuser'
El inicio de sesión remoto que solía conectarse a @rmtsrvname cuando @useself es false.
@rmtuser es sysname, con un valor por defecto de NULL. Cuando el servidor remoto es una instancia de SQL Server que no utiliza autenticación de Windows, @rmtuser es un inicio de sesión en SQL Server.
[ @rmtpassword = ] N'rmtpassword'
La contraseña asociada a @rmtuser.
@rmtpassword es sysname, con un valor por defecto de NULL.
Valores de código de retorno
0 (correcto) o 1 (erróneo).
Observaciones
Cuando un usuario inicia sesión en el servidor local y ejecuta una consulta distribuida que accede a una tabla en el servidor enlazado, el servidor local debe iniciar sesión en el servidor enlazado en nombre del usuario para acceder a esa tabla. Úsalo sp_addlinkedsrvlogin para especificar las credenciales que utiliza el servidor local para iniciar sesión en el servidor vinculado.
Nota:
Para crear los mejores planes de consulta cuando usas una tabla en un servidor enlazado, el procesador de consultas debe tener estadísticas de distribución de datos del servidor enlazado. Los usuarios que tienen permisos limitados en cualquier columna de la tabla pueden no tener permisos suficientes para obtener todas las estadísticas útiles, y pueden recibir un plan de consulta menos eficiente y experimentar un rendimiento pobre. Si el servidor enlazado es una instancia de SQL Server, para obtener todas las estadísticas disponibles, el usuario debe ser propietario de la tabla o ser miembro del rol de servidor fijo sysadmin , el rol de base de datos fija db_owner o el rol de base de datos fija 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 SHOW_STATISTICS DBCC. Para más información, consulte la sección de Permisos de DBCC SHOW_STATISTICS.
Se crea automáticamente un mapeo por defecto entre todos los inicios de sesión en el servidor local y los inicios de sesión remotos en el servidor vinculado ejecutando sp_addlinkedserver. El mapeo por defecto indica que SQL Server utiliza 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 @useself el servidor enlazado en true sin especificar un nombre de usuario local. Úsalo sp_addlinkedsrvlogin solo para cambiar el mapeo predeterminado o para añadir nuevos mapeos para inicios de sesión locales específicos. Para eliminar el mapeo por defecto o cualquier otro mapeo, usa sp_droplinkedsrvlogin.
En lugar de tener que crear sp_addlinkedsrvlogin un mapeo de inicio de sesión predeterminado, 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 siguientes condiciones:
Un usuario está conectado a SQL Server mediante el Modo de Autenticación de Windows.
La delegación de cuentas de seguridad está disponible tanto en el cliente como en el servidor emisor.
El proveedor soporta el Modo de Autenticación de Windows; por ejemplo, SQL Server ejecutándose en Windows.
Nota:
La delegación no tiene que estar activada para escenarios de un solo salto, pero sí es necesaria para escenarios de varios saltos.
Una vez que la autenticación ha sido realizada por el servidor enlazado utilizando los mapeos definidos al ejecutarse sp_addlinkedsrvlogin en la instancia local de SQL Server, los permisos sobre objetos individuales en la base de datos remota son determinados por el servidor vinculado, no por el servidor local.
sp_addlinkedsrvlogin No se puede ejecutar desde dentro de una transacción definida por el usuario.
Permissions
Requiere permiso de ALTERAR CUALQUIER INICIO DE SESIÓN en el servidor.
Examples
A. Conecta todos los inicios de sesión locales al servidor vinculado usando sus propias credenciales de usuario
El siguiente ejemplo crea un mapeo para asegurarse de que todos los inicios de sesión en el servidor local se conecten al servidor Accounts vinculado usando sus propias credenciales de usuario.
EXECUTE sp_addlinkedsrvlogin 'Accounts';
O
EXECUTE sp_addlinkedsrvlogin 'Accounts', 'true';
Nota:
Si existen mapeos explícitos creados para inicios de sesión individuales, tienen prioridad sobre cualquier mapeo global que pueda existir para ese servidor vinculado.
B. Conecta un inicio de sesión específico al servidor vinculado usando diferentes credenciales de usuario
El siguiente ejemplo crea un mapeo para asegurarse de que el usuario Domain\Mary de Windows se conecte al servidor Accounts vinculado usando el inicio MaryPde sesión . Reemplace por <password> una contraseña segura.
EXECUTE sp_addlinkedsrvlogin 'Accounts', 'false', 'Domain\Mary', 'MaryP', '<password>';
Precaución
Este ejemplo no utiliza la autenticación de Windows. Las contraseñas se transmitirán sin cifrar. Las contraseñas pueden ser visibles en definiciones de fuentes de datos y scripts que se guardan en disco, en copias de seguridad y en archivos de registro. Nunca uses una contraseña de administrador en este tipo de conexión. Consulta con tu administrador de red para recibir orientación de seguridad específica para tu entorno.
C. Asigna el inicio de sesión local específico a un inicio de sesión remoto de servidor
En algunos casos, como con Azure SQL Managed Instance, para ejecutar un trabajo SQL Agent que ejecute una consulta Transact-SQL (T-SQL) en un servidor remoto a través de un servidor enlazado, necesitas crear un mapeo entre un inicio de sesión en el servidor local y otro en el servidor remoto que tiene permiso para ejecutar la consulta 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 estás mapeando los inicios de sesión para un trabajo de SQL Agent en Azure SQL Managed Instance, el inicio de sesión local que asignas al inicio de sesión remoto debe ser el propietario del trabajo SQL Agent, a menos que el trabajo SQL Agent sea sysadmin, en cuyo caso deberías mapear todos los inicios de sesión locales. Para más información, revisa los trabajos de SQL Agent con Azure SQL Managed Instance.
Ejecuta el siguiente comando de ejemplo en el servidor local para mapear el inicio de sesión local_login_name local con el inicio de sesión login_name remoto del servidor al conectarte al servidor remote_serverenlazado:
EXECUTE master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = N'<local_login_name>',
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>';
D. Mapea todos los inicios de sesión locales a un inicio de sesión remoto de servidor
Al configurar locallogin en NULL, puedes asignar todos los inicios de sesión locales a un inicio de sesión en el servidor remoto.
Mapear todos los inicios de sesión locales a un inicio de sesión remoto de servidor es necesario al ejecutar un trabajo de Azure SQL SQL Managed Instance Agent propiedad del administrador de sistemas que consulta un servidor remoto a través de un servidor vinculado. Para más información, revisa los trabajos de SQL Agent con Azure SQL Managed Instance. 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.
Ejecuta 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 conectarte al servidor remote_serverenlazado:
EXECUTE master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'<remote_server>',
@useself = N'False',
@locallogin = NULL,
@rmtuser = N'<login_name>',
@rmtpassword = '<login_password>';
E. Revisa los inicios de sesión vinculados
El siguiente ejemplo muestra todos los inicios de sesión que han sido mapeados 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;