In SQL Server è presente un'impostazione di "accesso ai dati" che abilita e disabilita un server collegato per l'accesso alle query distribuite. Se ricevi l'errore "Il server non è configurato per l'ACCESSO AI DATI", probabilmente è perché stai tentando di eseguire una query distribuita su un server collegato che non è configurato per l'accesso ai dati. Questo può accadere anche quando tenti di eseguire OPENQUERY()
contro il tuo server locale.
Puoi usare sp_serveroption
per abilitare o disabilitare l'accesso ai dati su un determinato server. Tuttavia, potresti voler controllare le impostazioni esistenti prima di iniziare a modificarle. I seguenti esempi mostrano come farlo.
Esempio 1:interrogare sys.servers
Vista di sistema
Probabilmente il modo migliore per verificare se l'accesso ai dati è abilitato è interrogare sys.servers
vista del catalogo di sistema. Puoi restituire tutte le colonne o solo quelle che desideri vengano restituite. Ecco un esempio di restituzione di due colonne:
SELECT name, is_data_access_enabled FROM sys.servers;
Risultato:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
In questo caso, l'accesso ai dati è abilitato per il server chiamato Homer , ma non per il server denominato sqlserver007 .
Esempio 2:esegui sp_helpserver
Procedura memorizzata di sistema
Il sp_helpserver
anche la procedura memorizzata di sistema ci fornirà queste informazioni, sebbene in un formato diverso:
EXEC sp_helpserver;
Risultato:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | name | network_name | status | id | collation_name | connect_timeout | query_timeout | |--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------| | sqlserver007 | sqlserver007 | rpc,rpc out,use remote collation | 0 | NULL | 0 | 0 | | Homer | NULL | data access,use remote collation | 1 | NULL | 0 | 0 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
Se guardi nello stato colonna, vedrai che accesso ai dati è incluso nella riga per Homer , ma non per sqlserver007 .
Su quale server devo eseguire il codice?
Devi eseguire il codice su locale server, non il server remoto. Con questo intendo, se stai verificando se puoi eseguire query distribuite su un server collegato, esegui il codice sul server da cui intendi eseguire query distribuite da .
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 per vedere se l'accesso ai dati è abilitato per Homer server collegato.
Non ho bisogno di passare a Homer per verificarne l'impostazione. In effetti, se salto, potrebbe effettivamente avere un'impostazione diversa.
Per dimostrare questo punto, ecco cosa ottengo se confronto i risultati del server collegato con l'impostazione effettiva sul server remoto.
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 sua controparte del server collegato.
Il fatto di essere stato in grado di recuperare queste informazioni tramite una query distribuita supporta l'affermazione che era l'impostazione del mio server che ha abilitato la query distribuita.