Condividi tramite


sp_addlinkedsrvlogin (Transact-SQL)

Si applica a: SQL Server

Crea o aggiorna un mapping tra un account di accesso nell'istanza locale di SQL Server e un account di sicurezza in un server remoto.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

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

Argomenti

[ @rmtsrvname = ] N'rmtsrvname'

Nome di un server collegato a cui si applica il mapping dell'account di accesso. @rmtsrvname è sysname, senza impostazione predefinita.

[ @useself = ] 'useself'

Determina se connettersi a rmtsrvname rappresentando gli account di accesso locali o inviando in modo esplicito un account di accesso e una password. @useself è varchar(8), con il valore predefinito true.

  • Valore di true specifica che gli account di accesso usano le proprie credenziali per connettersi a @rmtsrvname, con gli argomenti @rmtuser e @rmtpassword ignorati.
  • falsespecifica che gli argomenti @rmtuser e @rmtpassword vengono utilizzati per connettersi a @rmtsrvname per il @locallogin specificato.

Se @rmtuser e @rmtpassword sono impostati su NULL, non viene usato alcun account di accesso o password per connettersi al server collegato.

[ @locallogin = ] N'locallogin'

Un account di accesso nel server locale. @locallogin è sysname, con un valore predefinito .NULL NULL specifica che questa voce si applica a tutti gli account di accesso locali che si connettono a @rmtsrvname. In caso contrario NULL, @locallogin può essere un account di accesso di SQL Server o un account di Windows. L'account di Windows deve avere accesso diretto a SQL Server o tramite l'appartenenza a un gruppo di Windows.

[ @rmtuser = ] N'rmtuser'

Account di accesso remoto usato per connettersi a @rmtsrvname quando @useself è false. @rmtuser è sysname, con un valore predefinito .NULL Quando il server remoto è un'istanza di SQL Server che non usa l'autenticazione di Windows, @rmtuser è un account di accesso di SQL Server.

[ @rmtpassword = ] N'rmtpassword'

Password associata a @rmtuser. @rmtpassword è sysname, con il valore predefinito NULL.

Valori del codice restituito

0 (esito positivo) o 1 (errore).

Osservazioni:

Quando un utente accede al server locale ed esegue una query distribuita che accede a una tabella del server collegato, il server locale deve accedere al server collegato per parte dell'utente che desidera accedere a tale tabella. Usare sp_addlinkedsrvlogin per specificare le credenziali usate dal server locale per accedere al server collegato.

Nota

Per creare i piani di query migliori quando si usa una tabella in un server collegato, Query Processor deve disporre di statistiche di distribuzione dei dati dal server collegato. Gli utenti con autorizzazioni limitate per qualsiasi colonna della tabella potrebbero non disporre delle autorizzazioni sufficienti per ottenere tutte le statistiche utili, nonché ricevere un piano di query meno efficiente e riscontrare un peggioramento delle prestazioni. Se il server collegato è un'istanza di SQL Server, per ottenere tutte le statistiche disponibili, l'utente deve possedere la tabella o essere membro del ruolo predefinito del server sysadmin , il ruolo predefinito del database db_owner o il ruolo predefinito del database db_ddladmin nel server collegato. SQL Server 2012 SP1 (11.0.3x) modifica le restrizioni di autorizzazione per ottenere statistiche e consente agli utenti con l'autorizzazione SELECT di accedere alle statistiche disponibili tramite DBCC SHOW_STATISTICS. Per altre informazioni, vedere la sezione Autorizzazioni di DBCC SHOW_STATISTICS.

Un mapping predefinito tra tutti gli account di accesso nel server locale e gli account di accesso remoti nel server collegato viene creato automaticamente eseguendo sp_addlinkedserver. Il mapping predefinito indica che SQL Server usa le credenziali utente dell'account di accesso locale durante la connessione al server collegato per conto dell'account di accesso. Equivale all'esecuzione sp_addlinkedsrvlogin con @useself impostato su true per il server collegato, senza specificare un nome utente locale. Usare sp_addlinkedsrvlogin solo per modificare il mapping predefinito o per aggiungere nuovi mapping per account di accesso locali specifici. Per eliminare il mapping predefinito o qualsiasi altro mapping, usare sp_droplinkedsrvlogin.

Anziché dover usare sp_addlinkedsrvlogin per creare un mapping di accesso predeterminato, SQL Server può usare automaticamente le credenziali di sicurezza di Windows (nome e password di accesso di Windows) di un utente che esegue la query per connettersi a un server collegato quando esistono tutte le condizioni seguenti:

  • Un utente è connesso a SQL Server tramite la modalità di autenticazione di Windows.

  • È disponibile la delega dell'account di sicurezza nel client e nel server di origine.

  • Il provider supporta la modalità di autenticazione di Windows; Ad esempio, SQL Server in esecuzione in Windows.

Nota

La delega non deve essere abilitata per gli scenari a hop singolo, ma è necessaria per scenari con più hop.

Dopo che l'autenticazione è stata eseguita dal server collegato usando i mapping definiti dall'esecuzione sp_addlinkedsrvlogin nell'istanza locale di SQL Server, le autorizzazioni per singoli oggetti nel database remoto vengono determinate dal server collegato, non dal server locale.

sp_addlinkedsrvlogin non può essere eseguito dall'interno di una transazione definita dall'utente.

Autorizzazioni

È richiesta l'autorizzazione ALTER ANY LOGIN nel server.

Esempi

R. Connettere tutti gli account di accesso locali al server collegato usando le proprie credenziali utente

Nell'esempio seguente viene creato un mapping per assicurare che tutti gli account di accesso del server locale si connettano al server collegato Accounts utilizzando le proprie credenziali.

EXEC sp_addlinkedsrvlogin 'Accounts';

O

EXEC sp_addlinkedsrvlogin 'Accounts', 'true';

Nota

Se sono presenti mapping espliciti creati per singoli account di accesso, hanno la precedenza su tutti i mapping globali che potrebbero esistere per il server collegato.

B. Connettere un account di accesso specifico al server collegato usando credenziali utente diverse

Nell'esempio seguente viene creato un mapping per assicurare che l'utente di Windows Domain\Mary si connetta al server collegato Accounts tramite l'account MaryP e la password d89q3w4u.

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

Attenzione

Questo esempio non usa l'autenticazione di Windows. Le password verranno trasmesse senza essere crittografate. Le password potrebbero essere visibili nelle definizioni e negli script dell'origine dati salvati su disco, nei backup e nei file di log. Non utilizzare mai una password di amministratore per questo tipo di connessioni. Per ulteriori informazioni sulla sicurezza specifiche al proprio ambiente, consultare l'amministratore di rete.

C. Eseguire il mapping di un account di accesso locale specifico a un account di accesso remoto al server remoto

In alcuni casi, ad esempio con Istanza gestita di SQL di Azure, per eseguire un processo di SQL Agent che esegue una query Transact-SQL (T-SQL) in un server remoto tramite un server collegato, è necessario creare un mapping tra un account di accesso nel server locale a un account di accesso nel server remoto che dispone dell'autorizzazione per eseguire la query T-SQL. Quando il processo di SQL Agent si connette al server remoto tramite il server collegato, esegue la query T-SQL nel contesto dell'account di accesso remoto, che deve disporre delle autorizzazioni necessarie per eseguire la query T-SQL.

Se si esegue il mapping degli account di accesso per un processo di SQL Agent in Istanza gestita di SQL di Azure, l'account di accesso locale mappato all'account di accesso remoto deve essere il proprietario del processo di SQL Agent, a meno che il processo di SQL Agent non sia sysadmin, nel qual caso è necessario eseguire il mapping di tutti gli account di accesso locali. Per altre informazioni, vedere Processi di SQL Agent con Istanza gestita di SQL di Azure.

Eseguire il comando di esempio seguente nel server locale per eseguire il mapping dell'account di accesso locale all'account local_login_name di accesso login_name remoto al server remoto durante la connessione al server remote_servercollegato :

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. Eseguire il mapping di tutti gli account di accesso locali a un account di accesso al server remoto

Impostando su NULLlocallogin , è possibile eseguire il mapping di tutti gli account di accesso locali a un account di accesso nel server remoto.

Il mapping di tutti gli account di accesso locali a un account di accesso remoto al server remoto è necessario quando si esegue un processo di SQL Agent Istanza gestita di SQL di Azure di proprietà di sysadmin che esegue una query su un server remoto tramite un server collegato. Per altre informazioni, vedere Processi di SQL Agent con Istanza gestita di SQL di Azure. Quando il processo di SQL Agent si connette al server remoto tramite il server collegato, esegue la query T-SQL nel contesto dell'account di accesso remoto, che deve disporre delle autorizzazioni necessarie per eseguire la query T-SQL.

Eseguire il comando di esempio seguente nel server locale per eseguire il mapping di tutti gli account di accesso locali all'account di accesso login_name remoto al server remoto durante la connessione al server remote_servercollegato :

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

E. Controllare gli account di accesso collegati

L'esempio seguente mostra tutti gli account di accesso di cui è stato eseguito il mapping per un server collegato:

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;