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

2 modi per verificare se l'accesso ai dati è abilitato in SQL Server (esempi T-SQL)

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.