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