首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

解決 SQL Server 「Ad Hoc Distributed Queries」停用導致 OPENROWSET/OPENDATASOURCE 失敗

     編輯:關於SqlServer

錯誤現象

執行 SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 5.0;HDR=YES;Database=E:\class.xls', 'Sheet1$') 時出現:

SQL Server 阻止了對組件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 的存取,因為此組件已作為此伺服器安全性組態的一部分而被關閉。系統管理員可以透過使用 sp_configure 啟用 'Ad Hoc Distributed Queries'。

根本原因

SQL Server 2005+ 預設停用 Ad Hoc Distributed Queries** 進階選項,以減少攻擊面。需明確啟用才能使用 OPENROWSET、OPENDATASOURCE 進行臨時分散式查詢。

啟用腳本 (立即生效,無需重啟)

-- 1. 顯示進階選項
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;

-- 2. 啟用 Ad Hoc Distributed Queries
EXEC sp_configure 'Ad Hoc Distributed Queries', 1;
RECONFIGURE;

用畢關閉 (安全最佳實務)

-- 1. 關閉 Ad Hoc Distributed Queries
EXEC sp_configure 'Ad Hoc Distributed Queries', 0;
RECONFIGURE;

-- 2. 隱藏進階選項
EXEC sp_configure 'show advanced options', 0;
RECONFIGURE;

驗證目前狀態

EXEC sp_configure 'Ad Hoc Distributed Queries';
-- run_value = 1 表示啟用,0 表示停用

替代方案:連結伺服器 (更安全、可重用)

若頻繁存取同一外部資料源,建議建立 連結伺服器,不需啟用 Ad Hoc 選項:

EXEC sp_addlinkedserver 
    @server = 'ExcelData', 
    @srvproduct = 'ACE', 
    @provider = 'Microsoft.ACE.OLEDB.12.0', 
    @datasrc = 'E:\class.xlsx', 
    @provstr = 'Excel 12.0;HDR=YES';

-- 查詢
SELECT * FROM OPENQUERY(ExcelData, 'SELECT * FROM [Sheet1$]');

優點:權限可精細控制 (只授予特定登入存取連結伺服器)、連線字串集中管理、不需開放 Ad Hoc 風險。

常見連接字串參考

資料源Provider連接字串範例
Excel 97-2003 (.xls)Microsoft.Jet.OLEDB.4.0Excel 5.0;HDR=YES;Database=path.xls
Excel 2007+ (.xlsx)Microsoft.ACE.OLEDB.12.0Excel 12.0;HDR=YES;Database=path.xlsx
Access (.mdb)Microsoft.Jet.OLEDB.4.0Database=path.mdb;User ID=admin;Password=;
Access (.accdb)Microsoft.ACE.OLEDB.12.0Database=path.accdb;User ID=admin;Password=;
CSV 文字檔Microsoft.Jet.OLEDB.4.0Text;HDR=YES;Database=folder_path

注意事項

  • 64 位元 SQL Server 需安裝 64 位元 ACE/OLEDB Provider (Microsoft Access Database Engine 2010/2016 Redistributable)。
  • 啟用 Ad Hoc 後,任何具備權限的登入皆可任意存取檔案系統資料,務必用完即關。
  • 生產環境建議:永久停用 Ad Hoc,全面改用連結伺服器或 SSIS/BCP 匯入。

結語

Ad Hoc Distributed Queries 是便利與風險的雙面刃。臨時查詢可短暫啟用;長期存取請採連結伺服器或 ETL 流程,落實最小權限與最小攻擊面原則。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved