解決 Sql Server 中跨 Server 調用時提示 Server is not configured for DATA ACCESS

解決 Sql Server 中跨 Server 調用時提示 Server is not configured for DATA ACCESS

本文爲機翻,原文地址

嘗試對禁用了數據訪問設置的服務器運行分佈式查詢時,SQL Server中的“服務器未配置用於數據訪問”錯誤是常見錯誤。

該錯誤將包含您要訪問的服務器的名稱。例如,如果您的服務器名稱是SQL01,則錯誤將顯示如下內容:

“數據訪問”是啓用和禁用鏈接服務器以進行分佈式查詢訪問的設置。

導致此錯誤的常見原因是您嘗試OPENQUERY()在本地服務器上運行。如果您確實想OPENQUERY()在服務器上運行,則需要確保爲該服務器啓用了數據訪問-即使它是您的本地服務器。

本文通過一個示例運行一個生成錯誤的查詢,檢查服務器是否啓用了數據訪問,啓用數據訪問,重新檢查,最後再次運行查詢。如果您不想遍歷整個場景,請向下滾動到下面的“解決方案”標題。另外,請查看如何在SQL Server中啓用和禁用數據訪問,以獲取啓用和禁用數據訪問的快速示例。

如果只想檢查設置,還請檢查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()這樣我就可以選擇所需的列。Doh!不像我想的那麼簡單!

但是這個minor hiccup很容易解決,所以讓我們繼續。

示例2 –檢查數據訪問設置

通過檢查sys.servers系統目錄視圖,我們可以查看服務器是否啓用了數據訪問。

SELECT 
  name,
  is_data_access_enabled 
FROM sys.servers;

結果:

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

在這種情況下,將爲名爲的服務器啓用數據訪問荷馬,但不適用於名爲 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專欄,您將看到data access包含在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               |
+--------------+--------------------------------+----------------------------------------------+------+------------------+-------------------+-----------------+

現在我們可以看到data access已添加到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()在本地服務器上使用,但如果我嘗試針對(遠程)鏈接服務器運行分佈式查詢,則將應用相同的修復程序。無論如何,以上步驟仍在我的本地服務器上完成(無需觸摸遠程服務器)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章