I server collegati (o linked server) servono per collegare un’istanza di Sql Server ad un’altra sorgente dati; questa tipicamente è un’altra istanza Sql Server, ma potrebbe anche essere un file Excel, un database Access o qualunque fonte di dati per il quale esista un provider Ole DB.
In realtà, non è detto che il server collegato punti ad un’istanza Sql Server diversa: ad esempio, si potrebbe creare un server collegato per accedere ad alcune tabelle che sicuramente verranno spostate dal database/server attuale ad un altro, attualmente non disponibile. In questo caso, una volta che il nuovo server sarà operativo, basterà variare la sorgente del server collegato e le nuove tabelle saranno gestite da lì senza necessità di ulteriori modifiche.
Ma come si crea un server collegato? In questa prima parte vedremo la gestione tramite interfaccia utente, poi nel prossimo articolo vedremo come farlo da codice.
Tramite interfaccia utente
Usando Sql Server Management Studio (SSMS per i suoi pochi amici), possiamo accedere alla gestione dei server collegati attraverso i nodi Oggetti server (Server Objects) / Server collegati (Linked Server):

Per creare un nuovo server collegato, occorre evidenziare il nodo Server collegato, premere il tasto destro del mouse e dal menu contestuale che apparirà scegliere la voce “Nuovo server collegato…” (“New Linked Server…“)

Apparirà una form che chiede di inserire i parametri per creare il collegamento. Il primo parametro, Server collegato (Linked server), indica il nome da assegnare al collegamento alla fonte dati:
- se Tipo server (Server type) è Sql Server, allora questo parametro deve corrispondere al nome dell’istanza Sql Server che vogliamo collegare; in questo caso non occorre impostare gli altri parametri in questo tab
- se invece tipo server è Altra origine dati (Other data source), allora possiamo scegliere questo nome arbitrariamente, con l’ovvia limitazione di non poter scegliere un nome già usato per un altro collegamento; in questo caso dovremo impostare almeno alcuni dei parametri successivi.

Per collegarci ad un altro Sql Server, scegliamo il Provider “Sql Server Native Client” ed impostiamo solo il campo Origine dati (Data source) con il nome dell’istanza Sql:

Indipendentemente dal Tipo server che abbiamo scelto in precedenze, passiamo al tab Sicurezza (Security) per indicare come il nostro Server accedere a quello remoto:

Nella parte superiore della form è possibile definire gli utenti che accederanno al server collegato, eventualmente creando delle associazioni (mapping) tra utenti locali (del nostro server) ed utenti remoti (cioé del server collegato) con tanto di password.

Nella parte inferiore, possiamo indicare come gestire i tentativi di connessione al server remoto da parte di utenti locali che non siano stati gestiti tramite le associazioni appena viste; possiamo scegliere tra quattro possibilità:
- Non verranno effettuate (Not be made): impedisce l’accesso ad utenti che non siano stati “mappati”
- Verranno effettuate senza un contesto di sicurezza (Be made without using a security context): tenta la connessione al server senza usare autenticazione; non ha senso per una connessione ad un server Sql, mentre è sensato per una connessione ad una sorgente come ad esempio un file di testo (seguirà un articolo ad hoc, sull’argomento)
- Verranno effettuate con il contesto di sicurezza corrente dell’account di accesso (Be made using the login’s current security context): tenta la connessione tramite l’account di Windows (che in un ambiente aziendale normalmente diventa l’account del dominio); ovviamente funziona se il server collegato accetta l’autenticazione di Windows (quindi ha senso per una connessione ad un server Sql, non per una connessione ad un file di testo)
- Verranno effettuate con il contesto di sicurezza seguente (Be made using this security context): permette di connettersi usando le credenziali Account di accesso remoto (Remote login) e Password (With password) indicate sotto; ovviamente funziona se il server collegato prevede una sua gestione delle autenticazioni (quindi potrebbe avere senso per un Sql, non per un file)
Nell’ultimo tab, infine, vengono impostati alcuni parametri per la connessione:

- Regole di confronto compatibili (Collation compatible): indica se il server collegato usa la stessa collation del server locale
- Accesso ai dati (Data access): indica se i dati residenti sul server collegato sono accessibili o meno; può sembrare insensato, ma – di fatto – diventa un modo per disabilitare temporaneamente un collegamento ad un server senza cancellarlo.
- RPC (Remote Procedure Call): se impostato a True, consente al server remoto di richiamare procedure sul server locale; se impostato a False, ovviamente, impedisce la chiamata di procedure locali da parte del server remoto
- Chiamate RPC in uscita (Rpc Out): speculare al precedente se impostato a True, consente al server locale di richiamare procedure sul server remoto
- Usa regole di confronto remote (Use remote collation): se True, usa le regole di confronto (collation) del server collegato, altrimenti usa quelle del server locale
- Nome regole di confronto (Collation name): se specificato, indica il nome della regola di confronto da usare per il collegamento al server; ovviamente il nome deve essere supportato da Sql Server
- Timeout di connessione (Connection timeout): abbastanza intuitivo, server ad impostare il tempo (in secondi) per ottenere la connessione; se impostato a 0, usa il parametro impostato con la
sp_configure 'remote query timeout'
(che per default dovrebbe valere 600 secondi, ossia 10 minuti) - Timeout query (Query timeout): abbastanza intuitivo, server ad impostare il tempo (in secondi) per ottenere risposta da un comando o query; se impostato a 0… l’intuitività va a farsi benedire, perché usa il parametro impostato con la
sp_configure 'query wait',
che per default dovrebbe valere -1, il che a sua volta si traduce in un tempo pari a 25 volte il tempo stimato per l’esecuzione della query. - Abilita innalzamento di livello delle transazioni (Enable promotion of distributed transactions): sembra semplice, ma non è semplicissimo: se impostato a
True
, il richiamo di una stored procedure remota causa l’inizio di una transazione distribuita, tramiteMSDTC
(Microsoft Distributed Transaction Coordinator
), che quindi deve essere attivo.
Una volta compilate tutte le eventuali opzioni, possiamo cliccare sul pulsante Ok e goderci lo spettacolo del nostro server appena collegato!

Ci resta solo un’ultima cosa da fare: rimuoverlo! Beh, una volta finito di usarlo, ovviamente! È sufficiente evidenziare il server collegato che ci interessa e premere il tasto [Canc]
(o [Del]
per le tastiere inglesi); oppure, sempre evidenziando il server collegato, fare click col tasto destro del mouse e – dal menu contestuale che si aprirà – scegliere il comando “Elimina”:

Apparirà una form che chiederà di confermare la rimozione del server collegato: basta cliccare sul tasto [Ok]
ed il server collegato … non sarà più collegato!
E per la gestione tramite Management Studio… no, non è veramente tutto, ma direi che ce n’è già abbastanza per partire; prossimamente vedremo come fare le stesse cose tramite codice Transact-Sql.