SQL Serverには、分散クエリアクセス用のリンクサーバーを有効または無効にする「データアクセス」設定があります。 「サーバーがデータアクセス用に構成されていません」というエラーが発生した場合は、データアクセス用に構成されていないリンクサーバーに対して分散クエリを実行しようとしている可能性があります。これは、OPENQUERY()
を実行しようとしたときにも発生する可能性があります ローカルサーバーに対して。
sp_serveroption
を使用できます 特定のサーバーでデータアクセスを有効または無効にします。ただし、変更を開始する前に、既存の設定を確認することをお勧めします。次の例は、その方法を示しています。
例1– sys.servers
をクエリします システムビュー
おそらく、データアクセスが有効になっているかどうかを確認する最良の方法は、sys.servers
にクエリを実行することです。 システムカタログビュー。すべての列を返すことも、返したい列だけを返すこともできます。 2つの列を返す例を次に示します。
SELECT name, is_data_access_enabled FROM sys.servers;
結果:
+--------------+--------------------------+ | name | is_data_access_enabled | |--------------+--------------------------| | sqlserver007 | 0 | | Homer | 1 | +--------------+--------------------------+
この場合、 Homer というサーバーでデータアクセスが有効になっています。 、ただし、 sqlserver007 というサーバーの場合は対象外です 。
例2– sp_helpserver
を実行します システムストアドプロシージャ
sp_helpserver
システムストアドプロシージャもこの情報を提供しますが、形式は異なります:
EXEC sp_helpserver;
結果:
+--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+ | 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 | +--------------+--------------------------------+----------------------------------+------+------------------+-------------------+-----------------+
status を見ると 列に、 データアクセス が表示されます Homer の行に含まれています 、ただし sqlserver007 ではありません 。
どのサーバーでコードを実行しますか?
ローカルに対してコードを実行する必要があります リモートサーバーではなく、サーバー。つまり、リンクサーバーに対して分散クエリを実行できるかどうかを確認する場合は、分散クエリを実行する予定のサーバーに対してコードを実行します。 。
私の例では、 sqlserver007 ローカルサーバーと Homer の名前です。 リモート/リンクサーバーです。 Homer に対して分散クエリを実行したい場合 、 sqlserver007 に対してコードを実行します Homer でデータアクセスが有効になっているかどうかを確認する リンクサーバー。
Homer にジャンプする必要はありません その設定を確認します。実際、私が飛び越えた場合、実際には異なる設定になっている可能性があります。
この点を示すために、リンクサーバーの結果をリモートサーバーの実際の設定と比較すると、次のようになります。
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;
結果:
+--------------------+--------------------------+ | (No column name) | is_data_access_enabled | |--------------------+--------------------------| | From local | 1 | | Remote setting | 0 | +--------------------+--------------------------+
この場合、ローカルサーバーの設定はリンクサーバーの対応するサーバーとは異なります。
分散クエリを介してこの情報を取得できたという事実は、分散クエリを有効にしたのは自分のサーバーの設定であるという主張を裏付けています。