SQL Server dispone di un'opzione di configurazione di "accesso ai dati" che abilita e disabilita un server collegato per l'accesso alle query distribuite.
Se ricevi un errore "Il server non è configurato per l'ACCESSO AI DATI", probabilmente dovrai abilitare l'accesso ai dati per il server collegato su cui stai tentando di eseguire la query distribuita. Al contrario, in alcuni casi potrebbe essere necessario disabilitare l'accesso ai dati.
Per abilitare o disabilitare l'accesso ai dati, utilizzare sp_serveroption
procedura memorizzata di sistema. Eseguilo sul server da cui intendi eseguire query distribuite. L'esempio seguente mostra come farlo.
Esempio 1 – Abilitare l'accesso ai dati
Ecco come abilitare l'accesso ai dati.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'TRUE';
In questo caso, il server si chiama sqlserver007
e ho impostato il DATA ACCESS
opzione per TRUE
.
Ecco un modo più conciso per fare la stessa cosa:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';
L'esecuzione di uno di questi consentirà l'accesso ai dati sul server collegato specificato.
A proposito, il server collegato specificato può essere il server locale, se necessario. Non è necessario che sia un server remoto.
Per verificare l'impostazione di accesso ai dati, esegui una query su sys.servers
vista catalogo di sistema.
SELECT name, is_data_access_enabled FROM sys.servers;
Risultato:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 1 | | Homer | 1 | +--------------+--------------------------+
Ancora una volta, lo esegui sul server locale, non sul server remoto.
Esempio 2:disabilitare l'accesso ai dati
Per disabilitare l'accesso ai dati, è sufficiente impostare @optvalue
a FALSE
.
EXEC sp_serveroption @server = 'sqlserver007', @optname = 'DATA ACCESS', @optvalue = 'FALSE';
Ora controlla di nuovo l'impostazione.
SELECT name, is_data_access_enabled FROM sys.servers;
Risultato:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
Su quale server devo eseguire il codice?
Esegui il codice sul server da cui intendi eseguire query distribuite.
Nel mio esempio, sqlserver007 è il nome del server locale e Homer è un server remoto/collegato. Se volessi eseguire query distribuite su Homer , eseguirei il codice su sqlserver007 .
Non ho bisogno di passare a Homer per cambiarne l'impostazione. In effetti, potrebbe avere un'impostazione diversa da quella che applico a sqlserver007 .
Per dimostrare questo punto, ecco cosa ottengo se confronto i risultati del server collegato con l'impostazione effettiva sul server remoto.
EXEC sp_serveroption @server = 'Homer', @optname = 'DATA ACCESS', @optvalue = 'TRUE'; SELECT 'From local', is_data_access_enabled FROM sys.servers WHERE name = 'Homer' UNION ALL SELECT 'Remote setting', is_data_access_enabled FROM Homer.master.sys.servers WHERE server_id = 0;
Risultato:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
In questo caso, il server locale ha un'impostazione diversa rispetto alla controparte del server collegato.
E il fatto che sia stato in grado di recuperare queste informazioni tramite una query distribuita dimostra che è stata l'impostazione del mio server ad abilitare la query distribuita, non quella del server remoto.