Compartilhar via


sp_addlinkedsrvlogin (Transact-SQL)

Aplica-se: SQL Server

Cria ou atualiza um mapeamento entre um logon na instância local do SQL Server e uma conta de segurança em um servidor remoto.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Argumentos

@rmtsrvname [ = ] N'rmtsrvname'

O nome de um servidor vinculado ao qual o mapeamento de logon se aplica. @rmtsrvname é sysname, sem padrão.

@useself [ = ] 'useself'

Determina se deve se conectar ao rmtsrvname representando logons locais ou enviando explicitamente um logon e senha. @useself é varchar(8), com um padrão de true.

  • Um valor de true especifica que os logons usam suas próprias credenciais para se conectar ao @rmtsrvname, com os argumentos @rmtuser e @rmtpassword sendo ignorados.
  • falseEspecifica que os argumentos @rmtuser e @rmtpassword são usados para se conectar ao @rmtsrvname para o @locallogin especificado.

Se @rmtuser e @rmtpassword estiverem definidos como NULL, nenhum login ou senha será usado para se conectar ao servidor vinculado.

@locallogin [ = ] N'locallogin'

Um login no servidor local. @locallogin é sysname, com um padrão de NULL. NULL Especifica que essa entrada se aplica a todos os logons locais que se conectam ao @rmtsrvname. Caso contrário NULL, @locallogin pode ser um logon do SQL Server ou uma conta do Windows. A conta do Windows deve ter acesso ao SQL Server diretamente ou por meio da associação em um grupo do Windows.

@rmtuser [ = ] N'rmtuser'

O login remoto usado para se conectar ao @rmtsrvname quando @useself é false. @rmtuser é sysname, com um padrão de NULL. Quando o servidor remoto é uma instância do SQL Server que não usa a Autenticação do Windows, @rmtuser é um logon do SQL Server.

@rmtpassword [ = ] N'rmtpassword'

A senha associada ao @rmtuser. @rmtpassword é sysname, com um padrão de NULL.

Valores do código de retorno

0 (sucesso) ou 1 (falha).

Comentários

Quando o usuário faz logon no servidor local e executa uma consulta distribuída que acessa uma tabela no servidor vinculado, o servidor local deve fazer logon no servidor vinculado em nome do usuário para acessar essa tabela. Use sp_addlinkedsrvlogin para especificar as credenciais que o servidor local usa para entrar no servidor vinculado.

Observação

Para criar os melhores planos de consulta quando você estiver usando uma tabela em um servidor vinculado, o processador de consultas deve ter estatísticas de distribuição de dados do servidor vinculado. Usuários que limitaram permissões em qualquer coluna da tabela podem não ter permissões suficientes para obter todas as estatísticas úteis e podem receber um plano de consulta menos eficiente e de baixo desempenho. Se o servidor vinculado for uma instância do SQL Server, para obter todas as estatísticas disponíveis, o usuário deverá possuir a tabela ou ser membro da função de servidor fixa sysadmin, da função de banco de dados fixa db_owner ou da função de banco de dados fixa db_ddladmin no servidor vinculado. O SQL Server 2012 SP1 (11.0.3x) modifica as restrições de permissão para obter estatísticas e permite que os usuários com permissão SELECT acessem as estatísticas disponíveis por meio do DBCC SHOW_STATISTICS. Para obter mais informações, consulte a seção Permissões do DBCC SHOW_STATISTICS.

Um mapeamento padrão entre todos os logons no servidor local e logons remotos no servidor vinculado é criado automaticamente executando sp_addlinkedserver. O mapeamento padrão afirma que o SQL Server usa as credenciais de usuário do logon local ao se conectar ao servidor vinculado em nome do logon. Isso é equivalente a executar sp_addlinkedsrvlogin com @useself set to true para o servidor vinculado, sem especificar um nome de usuário local. Use sp_addlinkedsrvlogin apenas para alterar o mapeamento padrão ou para adicionar novos mapeamentos para logons locais específicos. Para excluir o mapeamento padrão ou qualquer outro mapeamento, use sp_droplinkedsrvlogin.

Em vez de ter que usar sp_addlinkedsrvlogin para criar um mapeamento de logon predeterminado, o SQL Server pode usar automaticamente as credenciais de segurança do Windows (nome de logon e senha do Windows) de um usuário que emite a consulta para se conectar a um servidor vinculado quando todas as seguintes condições existirem:

  • Um usuário está conectado ao SQL Server usando o Modo de Autenticação do Windows.

  • A delegação da conta de segurança está disponível no cliente e no servidor destinatário.

  • O provedor dá suporte ao Modo de Autenticação do Windows; por exemplo, SQL Server em execução no Windows.

Observação

A delegação não precisa ser habilitada para cenários de salto único, mas é necessária para cenários de vários saltos.

Depois que a autenticação tiver sido executada pelo servidor vinculado usando os mapeamentos definidos pela execução sp_addlinkedsrvlogin na instância local do SQL Server, as permissões em objetos individuais no banco de dados remoto serão determinadas pelo servidor vinculado, não pelo servidor local.

sp_addlinkedsrvlogin não pode ser executado de dentro de uma transação definida pelo usuário.

Permissões

Requer a permissão ALTER ANY LOGIN no servidor.

Exemplos

R. Conecte todos os logons locais ao servidor vinculado usando suas próprias credenciais de usuário

O exemplo a seguir cria um mapeamento para verificar se todos os logons no servidor local se conectam por meio da Accounts do servidor vinculado usando suas próprias credenciais de usuário.

EXEC sp_addlinkedsrvlogin 'Accounts';

Ou

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

Observação

Se houver mapeamentos explícitos criados para logons individuais, eles terão precedência sobre quaisquer mapeamentos globais que possam existir para esse servidor vinculado.

B. Conecte um logon específico ao servidor vinculado usando diferentes credenciais de usuário

O exemplo a seguir cria um mapeamento para verificar se o usuário Domain\Mary do Windows se conecta por meio de Accounts do servidor vinculado usando o logon MaryP e a senha d89q3w4u.

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

Cuidado

Este exemplo não usa a Autenticação do Windows. As senhas serão transmitidas descriptografadas. As senhas podem estar visíveis em definições de fonte de dados e scripts salvos em disco, em backups e em arquivos de log. Nunca use uma senha de administrador nesse tipo de conexão. Consulte o administrador da rede para obter orientações sobre segurança específicas a seu ambiente.

C. Mapear login local específico para um login de servidor remoto

Em alguns casos, como com a Instância Gerenciada de SQL do Azure, para executar um trabalho do SQL Agent que executa uma consulta T-SQL (Transact-SQL) em um servidor remoto por meio de um servidor vinculado, você precisa criar um mapeamento entre um logon no servidor local para um logon no servidor remoto que tenha permissão para executar a consulta T-SQL. Quando o trabalho do SQL Agent se conecta ao servidor remoto por meio do servidor vinculado, ele executa a consulta T-SQL no contexto do logon remoto, que deve ter as permissões necessárias para executar a consulta T-SQL.

Se você estiver mapeando logons para um trabalho do SQL Agent na Instância Gerenciada de SQL do Azure, o logon local mapeado para o logon remoto deverá ser o proprietário do trabalho do SQL Agent, a menos que o trabalho do SQL Agent seja sysadmin, caso em que você deve mapear todos os logons locais. Para obter mais informações, examine Trabalhos do SQL Agent com a Instância Gerenciada de SQL do Azure.

Execute o seguinte comando de exemplo no servidor local para mapear o login local_login_name local para o login login_name do servidor remoto ao conectar-se ao 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. Mapear todos os logins locais para um login de servidor remoto

Ao definir locallogin como NULL, você pode mapear todos os logins locais para um login no servidor remoto.

O mapeamento de todos os logons locais para um logon de servidor remoto é necessário ao executar um trabalho do SQL Agent da Instância Gerenciada de SQL do Azure pertencente ao sysadmin que consulta um servidor remoto por meio de um servidor vinculado. Para obter mais informações, examine Trabalhos do SQL Agent com a Instância Gerenciada de SQL do Azure. Quando o trabalho do SQL Agent se conecta ao servidor remoto por meio do servidor vinculado, ele executa a consulta T-SQL no contexto do logon remoto, que deve ter as permissões necessárias para executar a consulta T-SQL.

Execute o seguinte comando de exemplo no servidor local para mapear todos os logins locais para o login login_name do servidor remoto ao se conectar ao 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. Verificar logins vinculados

O exemplo a seguir mostra todos os logons que foram mapeados para um 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;