Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como habilitar/desabilitar o acesso a dados no SQL Server (exemplo T-SQL)


O SQL Server tem uma opção de configuração de “acesso a dados” que habilita e desabilita um servidor vinculado para acesso a consultas distribuídas.

Se você receber um erro "O servidor não está configurado para ACESSO A DADOS", provavelmente precisará habilitar o acesso a dados para o servidor vinculado no qual está tentando executar a consulta distribuída. Por outro lado, também pode haver momentos em que você precise desabilitar o acesso a dados.

Para habilitar ou desabilitar o acesso a dados, use a sp_serveroption procedimento armazenado do sistema. Execute-o no servidor do qual você pretende executar consultas distribuídas. O exemplo a seguir demonstra como fazer isso.


Exemplo 1 – Habilitar acesso a dados


Veja como habilitar o acesso a dados.
EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'TRUE';

Neste caso, o servidor é chamado sqlserver007 , e defino o DATA ACCESS opção para TRUE .

Aqui está uma maneira mais concisa de fazer a mesma coisa:
sp_serveroption 'sqlserver007', 'DATA ACCESS', 'TRUE';

A execução de qualquer um deles habilitará o acesso a dados no servidor vinculado especificado.

A propósito, o servidor vinculado especificado pode ser o servidor local, se necessário. Não precisa ser um servidor remoto.

Para verificar a configuração de acesso a dados, execute uma consulta em sys.servers visualização do catálogo do sistema.
SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultado:
+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 1                        |
| Homer        | 1                        |
+--------------+--------------------------+

Novamente, você executa isso no servidor local – não no servidor remoto.

Exemplo 2 - Desativar acesso a dados


Para desabilitar o acesso a dados, basta definir @optvalue para FALSE .
EXEC sp_serveroption
  @server = 'sqlserver007',
  @optname = 'DATA ACCESS',
  @optvalue = 'FALSE';

Agora verifique a configuração novamente.
SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

Resultado:
+--------------+--------------------------+
| name         | is_data_access_enabled   |
|--------------+--------------------------|
| sqlserver007 | 0                        |
| Homer        | 1                        |
+--------------+--------------------------+

Em qual servidor eu executo o código?


Execute o código no servidor do qual você pretende executar consultas distribuídas.

No meu exemplo, sqlserver007 é o nome do servidor local e Homer é um servidor remoto/vinculado. Se eu quisesse executar consultas distribuídas em Homer , eu executaria o código em sqlserver007 .

Não preciso pular para Homer para alterar sua configuração. Na verdade, pode ter uma configuração diferente daquela que eu aplico em sqlserver007 .

Para demonstrar esse ponto, eis o que recebo se comparar os resultados do servidor vinculado com a configuração real no servidor 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;

Resultado:
+--------------------+--------------------------+
| (No column name)   | is_data_access_enabled   |
|--------------------+--------------------------|
| From local         | 1                        |
| Remote setting     | 0                        |
+--------------------+--------------------------+

Nesse caso, o servidor local tem uma configuração diferente da contraparte do servidor vinculado.

E o fato de eu ter conseguido recuperar essas informações por meio de uma consulta distribuída demonstra que foi a configuração do meu próprio servidor que permitiu a consulta distribuída, não a do servidor remoto.