sql >> データベース >  >> RDS >> Sqlserver

SQLServerで「サーバーがデータアクセス用に構成されていない」を修正する方法

    SQL Serverの「サーバーがデータアクセス用に構成されていません」エラーは、データアクセス設定が無効になっているサーバーに対して分散クエリを実行しようとした場合の一般的なエラーです。

    エラーには、アクセスしようとしているサーバーの名前が含まれます。たとえば、サーバー名がSQL01の場合、エラーは次のようになります。

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

    「データアクセス」は、分散クエリアクセス用のリンクサーバーを有効または無効にする設定です。

    このエラーの一般的な原因は、OPENQUERY()を実行しようとしたときです。 ローカルサーバーに対して。本当にOPENQUERY()を実行したい場合 サーバーに対しては、ローカルサーバーであっても、そのサーバーでデータアクセスが有効になっていることを確認する必要があります。

    この記事では、エラーを生成するクエリの実行、サーバーでデータアクセスが有効になっているかどうかの確認、データアクセスの有効化、再確認、最後にクエリの再実行の例について説明します。シナリオ全体を説明したくない場合は、下の「ソリューション」の見出しまで下にスクロールしてください。または、データアクセスを有効または無効にする簡単な例については、SQLServerでデータアクセスを有効および無効にする方法を確認してください。

    設定を確認したいだけの場合は、データアクセスが有効になっているかどうかを確認する2つの方法も確認してください。

    それ以外の場合は、読み進めてください。すべてこの記事で説明されています。

    例1-エラー

    エラーの原因となるシナリオの例を次に示します。

    SELECT 
      COLUMN_NAME,
      TYPE_NAME,
      PRECISION,
      LENGTH
    FROM 
    OPENQUERY (
      sqlserver007,
      'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
    );
    

    結果:

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

    この場合、OPENQUERY()を実行しようとしています。 sqlserver007 と呼ばれる自分のローカルサーバーに対して 、ただし、サーバーでデータアクセスが有効になっていないため、失敗します。

    なぜ私がOPENQUERY()を実行しているのか不思議に思うかもしれません。 ストアドプロシージャをローカルで呼び出すことができたときに、自分のサーバーに対して?それは本当ですが、この場合、ストアドプロシージャは必要以上の列を返すので、OPENQUERY()を実行するだけで十分簡単だと思いました。 必要な列を選択できるようにします。ドー!思ったほど簡単ではありません!

    ただし、この小さな問題は簡単に解決できるので、続けましょう。

    例2–データアクセス設定を確認する

    sys.serversを確認することで、サーバーでデータアクセスが有効になっているかどうかを確認できます。 システムカタログビュー。

    SELECT 
      name,
      is_data_access_enabled 
    FROM sys.servers;
    

    結果:

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

    この場合、 Homer というサーバーでデータアクセスが有効になっています。 、ただし、 sqlserver007 というサーバーの場合は対象外です 。

    興味がある場合は、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 ではありません 。

    例3–ソリューション

    データアクセスを許可する方法は次のとおりです。

    EXEC sp_serveroption
      @server = 'sqlserver007',
      @optname = 'DATA ACCESS',
      @optvalue = 'TRUE';
    

    結果:

    Commands completed successfully.
    

    例4–設定を再確認する

    これで、データアクセス設定を再確認できます。

    SELECT 
      name,
      is_data_access_enabled 
    FROM sys.servers;
    

    結果:

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

    これで、ローカルサーバーでデータアクセスが有効になりました。

    sp_helpserverの場合は次のようになります :

    EXEC sp_helpserver;
    

    結果:

    +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
    | 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               |
    +--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+
    

    これで、 データアクセス がわかります。 status の下に追加されました 列。

    例5–元のクエリを再実行する

    データアクセスを有効にしたので、元のクエリを再実行しましょう。

    SELECT 
      COLUMN_NAME,
      TYPE_NAME,
      PRECISION,
      LENGTH
    FROM 
    OPENQUERY (
      sqlserver007,
      'EXEC WideWorldImporters.[dbo].[sp_columns] Cities, Application;'
    );
    

    結果:

    +--------------------------+-------------+-------------+------------+
    | 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         |
    +--------------------------+-------------+-------------+------------+
    

    今回はエラーなしで実行されます。

    この例ではOPENQUERY()を使用しましたが ローカルサーバーでは、(リモート)リンクサーバーに対して分散クエリを実行しようとした場合にも同じ修正が適用されます。とにかく、上記の手順はローカルサーバーで実行されます(リモートサーバーにアクセスする必要はありません)。


    1. SQLite IN

    2. MySQLの1つを除くすべての列を選択しますか?

    3. MySQLで同等のgenerate_series()

    4. PHPでmysql_*関数を使用すべきではないのはなぜですか?