PREMESSA

Questo articolo non vuole esaminare nel dettaglio la teoria dietro ai linked server o come si fa a crearne uno, quanto piuttosto descrivere un particolare curioso quando si utilizza un linked server ad un database Access (un normale e vecchio .Mdb) su SQL Server 2008 R2 (può essere che il problema esista anche su altre versioni di SQL Server ma io ho lavorato su questa).


PROBLEMA

Dopo aver creato il linked server, se si prova ad utilizzare tale linked server da un utente di SQL Server non sysadmin, se  si prova ad eseguire una normale query del tipo
 
SELECT * FROM nome_linked_server...tabella

(la sintassi sarebbe linked.database.schema.tabella ma dato che Access ha un solo database e nessuno schema, i valori possono essere omessi) oppure  in alternativa

 

SELECT * FROM OPENQUERY ([NOME_LINKED_SERVER],'SELECT * FROM tabella)

Si ottiene questo bel messaggio
 
Msg 7416, Level 16, State 2, Line 1
Access to the remote server is denied because no login-mapping exists.

Se al contrario le stesse operazioni le facciamo da utente con ruolo sysadmin il tutto va a buon fine.


SOLUZIONE

Come dice abbastanza chiaramente il messaggio, non è stato possibile accedere al Linked Server perchè non esiste una mappatura tra la login SQL e quella del linked server remoto.
Di per sè la cosa è chiarissima, se non fosse per il fatto che su questo database Access NON E' STATA DEFINITA ALCUNA LOGIN! E proprio per questo motivo, il linked server è configurato per fare sempre connessioni without a security context 

linked ko

 

Quindi, tutto sommato, il messaggio lascia comunque perplessi visto che sul linked server c'è scritto fai la connessione senza usare nessun utente.

La soluzione è tutto sommato relativamente semplice dopo che si scopre che, all'interno di ciascun database Access, esiste un UTENTE NASCOSTO chiamato ADMIN con paswword vuota.

Di conseguenza, è sufficiente modificare il linked per utilizzare, per la connessione, un utente admin senza alcuna password:
 
linked access ok
 
Naturalmente un giorno qualcuno mi spiegherà perchè come sysadmin funziona tutto mentre come utente normale no.