Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Aggiungere un accesso al server collegato in SQL Server (esempio T-SQL)

In questo articolo creo un account di accesso per un server collegato in SQL Server. In questo caso utilizzo Transact-SQL (invece di utilizzare una GUI come SSMS).

Per creare un login per il server collegato, usa sp_addlinkedsrvlogin procedura memorizzata di sistema.

Sintassi

La sintassi è questa:

sp_addlinkedsrvlogin [ @rmtsrvname = ] 'rmtsrvname'   
     [ , [ @useself = ] { 'TRUE' | 'FALSE' | NULL } ]   
     [ , [ @locallogin = ] 'locallogin' ]   
     [ , [ @rmtuser = ] 'rmtuser' ]   
     [ , [ @rmtpassword = ] 'rmtpassword' ]

L'esempio seguente mostra come funziona. Per una spiegazione più dettagliata di ogni argomento, vedere la documentazione ufficiale di Microsoft.

Esempio 1:aggiungere un accesso per il server collegato

Ecco un esempio di aggiunta di un login di SQL Server chiamato Maggie per un server collegato chiamato Homer:

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

Eseguilo sul server locale dopo aver creato il server collegato. Avrai bisogno di un login corrispondente con le stesse credenziali sul server remoto effettivo.

Esempio 2:includi il server collegato

Per completezza, eccolo di nuovo, ma questa volta creo prima il server collegato:

EXEC sp_addlinkedserver 
    @server=N'Homer', 
    @srvproduct=N'', 
    @provider=N'MSOLEDBSQL', 
    @datasrc=N'172.17.0.2',
    @catalog='Music';

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Maggie', 
    @rmtpassword=N'BigStrong#Passw0rd';

Finché il server collegato (remoto) effettivo ha un accesso con le stesse credenziali, il server locale sarà in grado di accedere al server collegato.

Esempio 3:aggiungere l'accesso/utente sul server remoto

Come accennato, dovrai assicurarti che ci sia un accesso corrispondente sul server remoto. Dovrai anche assicurarti che questo login sia associato a un utente del database con le autorizzazioni appropriate.

Quindi, in questo caso, potremmo creare un login sul server remoto saltando sul server remoto ed eseguendo questo:

CREATE LOGIN Maggie
    WITH PASSWORD = 'BigStrong#Passw0rd';

USE Music;
CREATE USER Maggie FOR LOGIN Maggie;

GRANT SELECT ON DATABASE::Music TO Maggie; 

Questo crea un login chiamato Maggie e un corrispondente utente del database chiamato Maggie. Concede anche SELECT autorizzazioni a Maggie per il database Music.

Ora che l'ho fatto, tutte le query distribuite che utilizzano questo accesso saranno limitate al database Music.

Un'alternativa all'utilizzo di GRANT SELECT ON DATABASE , è aggiungere l'utente al db_datareader ruolo fisso del database, o forse a un ruolo personalizzato.

Se hai creato il server collegato prima di creare gli accessi e gli utenti del database sul server remoto, potrebbe essere necessario eliminare il server collegato e crearlo di nuovo. In tal caso, puoi rilasciarlo in questo modo:

EXEC sp_dropserver 'Homer', 'droplogins';

Una volta rilasciato, puoi creare nuovamente il server collegato e il relativo accesso associato.

Ho davvero bisogno di un accesso al server collegato?

È possibile che tu non abbia nemmeno bisogno di aggiungere un login come nell'esempio sopra.

Quando si crea per la prima volta un server collegato in SQL Server, viene creato automaticamente un mapping predefinito tra tutti gli accessi sul server locale e gli accessi remoti sul server collegato. SQL Server utilizza le credenziali dell'accesso locale durante la connessione al server collegato per conto dell'accesso.

Quindi, se il tuo accesso locale ha un accesso corrispondente sul server collegato, con le stesse credenziali e dispone delle autorizzazioni appropriate, sei a posto. Non è necessario aggiungere un login per il server collegato.

Detto questo, potresti avere altri motivi per aggiungere un accesso separato, come aggiungerlo per altri utenti.

Potresti anche voler creare una mappatura di accesso per un singolo utente locale, nel qual caso puoi usare il @locallogin argomento per specificare il login locale da mappare.

Vedere Come funzionano gli accessi sui server collegati per esempi di vari accessi locali che tentano di accedere a un accesso al server collegato in diversi scenari.