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

Creare un server collegato in SQL Server (esempio T-SQL)

In questo articolo viene fornito un esempio di creazione di un server collegato in SQL Server mediante Transact-SQL. L'uso di T-SQL consente di creare il server collegato senza fare affidamento su un'interfaccia utente grafica (come SSMS).

Sintassi

Per creare un server collegato utilizzando T-SQL, utilizzare sp_addlinkedserver procedura memorizzata di sistema.

La sintassi ufficiale è questa:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]   
     [ , [ @provider= ] 'provider_name' ]  
     [ , [ @datasrc= ] 'data_source' ]   
     [ , [ @location= ] 'location' ]   
     [ , [ @provstr= ] 'provider_string' ]   
     [ , [ @catalog= ] 'catalog' ]

La maggior parte degli argomenti è facoltativa, ma dovrai fornire il nome del server collegato.

Probabilmente vorrai anche specificare l'origine dati o la posizione del server collegato e forse il nome di un provider. Il catalog argomento consente di specificare un database predefinito su cui è mappato il server collegato. Consulta la documentazione ufficiale di Microsoft per una spiegazione di ciascuno di questi argomenti.

Esempio:crea il server collegato

Per creare un server collegato utilizzando T-SQL, eseguire sp_addlinkedserver stored procedure durante il passaggio del nome del server collegato e della sua origine.

Ecco un esempio di creazione di un server collegato:

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

In questo caso, il nome del server collegato è "Homer" e specifico l'indirizzo IP del server, seguito dalla porta TCP (nel mio caso è in realtà un container Docker sulla stessa macchina). Modificare il nome del server e l'indirizzo IP/porta come richiesto. Specifico anche un database predefinito chiamato "Music".

Questo esempio usa MSOLEDBSQL come nome del provider, ma puoi utilizzare il nome del provider applicabile nella tua situazione. Nel mio caso, mi sto collegando a un'altra istanza di SQL Server.

Nota che MSOLEDBSQL è il provider consigliato per SQL Server. Se hai già utilizzato SQLOLEDB o SQLNCLI , entrambi sono ora obsoleti. Microsoft ha deciso di annullare il ritiro di OLE DB e di rilasciarlo nel 2018.

Se dovessi collegarti a Oracle potresti usare OraOLEDB.Oracle , per MS Access potresti usare Microsoft.Jet.OLEDB.4.0 (per l'accesso ai formati 2002-2003) o Microsoft.ACE.OLEDB.12.0 (per il formato 2007). La documentazione ufficiale ha una tabella di parametri da utilizzare per diversi scenari.

Testare il server collegato

Dopo aver aggiunto il server collegato, puoi utilizzare sp_testlinkedserver per testarlo:

EXEC sp_testlinkedserver Homer;

Risultato (se riuscito):

Commands completed successfully.

Se ricevi un errore "Accesso non riuscito", è probabile che tu non abbia un accesso corrispondente sul server remoto. Avrai bisogno di un login corrispondente con le stesse credenziali di quello sul server locale.

Il modo in cui funziona è, quando si aggiunge per la prima volta il server collegato, viene creata automaticamente una mappatura predefinita 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. Se il tuo accesso locale non ha un accesso corrispondente sul server remoto, riceverai un errore "Accesso non riuscito".

Aggiungi un accesso per il server collegato

Se non desideri che il server collegato utilizzi il tuo login, puoi specificare un login diverso da utilizzare. Finché il server remoto ha un login corrispondente con le stesse credenziali, sarai a posto. Ovviamente, dovrai assicurarti che l'account remoto disponga delle autorizzazioni appropriate per fare ciò che ti serve.

Ecco un esempio di aggiunta di un account di accesso di SQL Server per il server collegato.

EXEC sp_addlinkedsrvlogin 
    @rmtsrvname=N'Homer', 
    @useself=N'FALSE', 
    @locallogin=NULL, 
    @rmtuser=N'Marge', 
    @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 collegato (remoto) effettivo.

Questo aggiunge un login chiamato "Marge" per il server collegato chiamato "Homer". Finché il server remoto ha un login con le stesse credenziali, il server locale sarà in grado di accedere al server collegato.

Vedere Aggiungere un accesso al server collegato in SQL Server per un esempio di aggiunta di un accesso corrispondente al server remoto.

Elimina un server collegato

Ecco un esempio di eliminazione del server collegato chiamato "Homer" e di tutti gli accessi associati.

EXEC sp_dropserver 'Homer', 'droplogins';

I droplogins l'argomento è facoltativo, ma se non lo si specifica quando si elimina un server collegato a cui sono associate voci di accesso al server collegato e remoto o è configurato come editore di replica, viene restituito un messaggio di errore.

Consulta Rimuovere un server collegato utilizzando T-SQL per ulteriori esempi di eliminazione di un server collegato.

Esegui una query distribuita sul server collegato

Ora che abbiamo creato il server collegato, ecco un esempio di esecuzione di una query distribuita su di esso:

SELECT * 
FROM Homer.Music.dbo.Artists;

L'unica differenza tra questa e una query locale è che devi aggiungere il nome del server collegato a FROM clausola.

In questo modo:

LinkedServer.Database.Schema.Table

In alternativa, puoi usare OPENQUERY() per eseguire una query pass-through:

SELECT * 
FROM OPENQUERY(
    Homer, 
    'SELECT * FROM Music.dbo.Artists;'
    );