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

Come abilitare/disabilitare l'accesso ai dati in SQL Server (esempio T-SQL)

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.