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

SQL Serverでデータアクセスが有効になっているかどうかを確認する2つの方法(T-SQLの例)

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

    この場合、ローカルサーバーの設定はリンクサーバーの対応するサーバーとは異なります。

    分散クエリを介してこの情報を取得できたという事実は、分散クエリを有効にしたのは自分のサーバーの設定であるという主張を裏付けています。


    1. MySQLWorkbenchで図からスクリプトを生成する方法

    2. ClusterControlが仮想IPを構成する方法とフェイルオーバー中に何を期待するか

    3. NVLとCoalesceのOracleの違い

    4. わずかな予算での高可用性-最小限の2ノードのMySQLGaleraクラスターの導入