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

Como corrigir “O servidor não está configurado para ACESSO A DADOS” no SQL Server


O erro “O servidor não está configurado para ACESSO A DADOS” no SQL Server é um erro comum ao tentar executar uma consulta distribuída em um servidor que tem sua configuração de acesso a dados desabilitada.

O erro terá o nome do servidor que você está tentando acessar. Por exemplo, se o nome do seu servidor for SQL01, o erro será algo assim:
Msg 7411, Level 16, State 1, Line 1
Server 'SQL01' is not configured for DATA ACCESS.

“Acesso a dados” é uma configuração que habilita e desabilita um servidor vinculado para acesso distribuído a consultas.

Uma causa comum desse erro é quando você tenta executar OPENQUERY() contra o servidor local. Se você realmente deseja executar OPENQUERY() contra o servidor, você precisará garantir que o acesso a dados esteja habilitado para esse servidor – mesmo que seja seu servidor local.



Este artigo apresenta um exemplo de execução de uma consulta que gera o erro, verificando se um servidor tem acesso a dados habilitado, habilitando o acesso a dados, verificando novamente e, finalmente, executando a consulta novamente. Se você não quiser percorrer todo o cenário, role para baixo até o título “A solução” abaixo. Como alternativa, confira Como habilitar e desabilitar o acesso a dados no SQL Server para obter um exemplo rápido de habilitar e desabilitar o acesso a dados.

Confira também 2 maneiras de verificar se o acesso a dados está ativado se você quiser apenas verificar a configuração.

Caso contrário, continue lendo – está tudo coberto neste artigo.

Exemplo 1 – O erro


Aqui está um exemplo de um cenário que causa o erro.
SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultado:
Msg 7411, Level 16, State 1, Line 1
Server 'sqlserver007' is not configured for DATA ACCESS.

Neste caso, estou tentando executar OPENQUERY() contra meu próprio servidor local chamado sqlserver007 , mas falha, porque o servidor não tem acesso a dados habilitado.

Você pode estar se perguntando por que estou executando OPENQUERY() contra meu próprio servidor quando eu poderia simplesmente chamar o procedimento armazenado localmente? Isso é verdade, mas neste caso o procedimento armazenado retorna mais colunas do que eu preciso, então achei que seria fácil apenas executá-lo através de OPENQUERY() para que eu pudesse escolher as colunas que preciso. Ah! Não é tão fácil quanto eu pensava!

Mas esse pequeno soluço é fácil de resolver, então vamos continuar.

Exemplo 2 – Verifique a configuração de acesso a dados


Podemos ver se um servidor tem acesso a dados habilitado verificando o 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 | 0                        |
| Homer        | 1                        |
+--------------+--------------------------+

Nesse caso, o acesso aos dados é habilitado para o servidor chamado Homer , mas não para o servidor chamado sqlserver007 .

Caso esteja interessado, o sp_helpserver procedimento armazenado do sistema também nos dará esta informação:
EXEC sp_helpserver;

Resultado:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
| 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 você olhar no status coluna, você verá que acesso a dados está incluído na linha de Homer , mas não para sqlserver007 .

Exemplo 3 – A Solução


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

Resultado:
Commands completed successfully.

Exemplo 4 – Verifique novamente a configuração


Agora podemos verificar novamente a configuração de acesso a dados.
SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

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

Agora meu servidor local tem acesso a dados habilitado.

E aqui está o que parece com sp_helpserver :
EXEC sp_helpserver;

Resultado:
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
| name         | network_name                   | status                                       | id   | collation_name   | connect_timeout   | query_timeout   |
|--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------|
| sqlserver007 | sqlserver007                   | rpc,rpc out,data access,use remote collation | 0    | NULL             | 0                 | 0               |
| Homer        | NULL                           | data access,use remote collation             | 1    | NULL             | 0                 | 0               |
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+

Agora podemos ver que acesso a dados foi adicionado sob o status coluna.

Exemplo 5 – Execute novamente a consulta original


Agora que habilitamos o acesso aos dados, vamos executar novamente a consulta original.
SELECT 
  COLUMN_NAME,
  TYPE_NAME,
  PRECISION,
  LENGTH
FROM 
OPENQUERY (
  sqlserver007,
  'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
);

Resultado:
+--------------------------+-------------+-------------+------------+
| COLUMN_NAME              | TYPE_NAME   | PRECISION   | LENGTH     |
|--------------------------+-------------+-------------+------------|
| CityID                   | int         | 10          | 4          |
| CityName                 | nvarchar    | 50          | 100        |
| StateProvinceID          | int         | 10          | 4          |
| Location                 | geography   | 2147483647  | 2147483647 |
| LatestRecordedPopulation | bigint      | 19          | 8          |
| LastEditedBy             | int         | 10          | 4          |
| ValidFrom                | datetime2   | 27          | 54         |
| ValidTo                  | datetime2   | 27          | 54         |
+--------------------------+-------------+-------------+------------+

Desta vez ele roda sem erro.

Embora este exemplo tenha usado um OPENQUERY() ao meu servidor local, a mesma correção se aplicaria se eu estivesse tentando executar uma consulta distribuída em um servidor vinculado (remoto). Independentemente disso, as etapas acima ainda são feitas no meu servidor local (não é necessário tocar no servidor remoto).