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

2 maneiras de verificar se o acesso a dados está habilitado no SQL Server (Exemplos de T-SQL)


No SQL Server, há uma configuração de “acesso a dados” que habilita e desabilita um servidor vinculado para acesso distribuído a consultas. Se você receber o erro “O servidor não está configurado para ACESSO A DADOS”, provavelmente é porque você está tentando executar uma consulta distribuída em um servidor vinculado que não está configurado para acesso a dados. Isso também pode acontecer quando você tenta executar OPENQUERY() contra o seu servidor local.

Você pode usar sp_serveroption para habilitar ou desabilitar o acesso a dados em um determinado servidor. No entanto, convém verificar as configurações existentes antes de começar a alterá-las. Os exemplos a seguir mostram como fazer isso.


Exemplo 1 – Consultar os sys.servers Visualização do sistema


Provavelmente, a melhor maneira de verificar se o acesso a dados está ativado é consultar o sys.servers visualização do catálogo do sistema. Você pode retornar todas as colunas ou apenas aquelas que deseja retornar. Aqui está um exemplo de retorno de duas colunas:
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 .

Exemplo 2 – Execute o sp_helpserver Procedimento armazenado do sistema


O sp_helpserver procedimento armazenado do sistema também nos fornecerá essas informações, embora em um formato diferente:
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 .

Em qual servidor eu executo o código?


Você precisa executar o código no local servidor, não o servidor remoto. Com isso quero dizer, se você estiver verificando se pode executar consultas distribuídas em um servidor vinculado, execute o código no servidor do qual você pretende executar consultas distribuídas de .

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 para ver se o acesso a dados está ativado para o Homer servidor vinculado.

Não preciso pular para Homer para verificar sua configuração. Na verdade, se eu pular, ele pode ter uma configuração diferente.

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

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.

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