破解「密碼保護的 Access 無法連結」難題
SQL Server 原生支援透過 OLE DB 存取 Access (Jet/ACE),但官方文件鮮少說明密碼參數寫法。本文實測三種連接方式在 **有資料庫密碼** 情況下的正確連接字串語法,並解析關鍵屬性 Jet OLEDB:Database Password 與 pwd 的差異。
一、核心屬性對照
| 方式 | 密碼關鍵字 | 屬性集 | 備註 |
OPENROWSET | pwd=密碼 | ODBC 風格 | Provider String 參數中直接加 ;pwd=xxx |
OPENDATASOURCE | Jet OLEDB:Database Password=密碼 | OLE DB 初始化屬性 | Init String 使用標準 OLE DB 關鍵字 |
| Linked Server | @provstr = ';pwd=密碼' | Provider String | sp_addlinkedserver 的 @provstr 參數 |
二、完整可執行範例(假設 C:\data\abc.mdb,密碼 test)
1. OPENROWSET(臨時查詢/更新)
-- 查詢
SELECT * FROM OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
';database=C:\data\abc.mdb;pwd=test',
'SELECT * FROM student WHERE id = 1'
);
-- 更新
UPDATE OPENROWSET(
'Microsoft.Jet.OLEDB.4.0',
';database=C:\data\abc.mdb;pwd=test',
'SELECT * FROM student WHERE id = 1'
) SET name = '張三';
2. OPENDATASOURCE(臨時查詢/更新,四部份命名)
SELECT * FROM OPENDATASOURCE(
'Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\data\abc.mdb;Jet OLEDB:Database Password=test'
)...student;
UPDATE OPENDATASOURCE(
'Microsoft.Jet.OLEDB.4.0',
'Data Source=C:\data\abc.mdb;Jet OLEDB:Database Password=test'
)...student SET name = '張三' WHERE id = 1;
3. Linked Server(持久化、可重複使用)
EXEC sp_addlinkedserver
@server = N'ACC_LINK',
@provider = N'Microsoft.Jet.OLEDB.4.0',
@srvproduct = N'OLE DB Provider for Jet',
@datasrc = N'C:\data\abc.mdb',
@provstr = N';pwd=test'; -- 關鍵:Provider String 帶入密碼
EXEC sp_addlinkedsrvlogin 'ACC_LINK', FALSE, NULL, NULL, NULL; -- 使用預設安全性上下文
-- 之後即可像本地表一樣操作
SELECT * FROM ACC_LINK...student WHERE id = 1;
UPDATE ACC_LINK...student SET name = '張三' WHERE id = 1;
三、64 位元環境注意事項
- 64 位 SQL Server **無法** 載入 32 位
Microsoft.Jet.OLEDB.4.0。
- 必須安裝 **Microsoft Access Database Engine 2010/2016 Redistributable (64-bit)**,改用 Provider
Microsoft.ACE.OLEDB.12.0 或 16.0。
- 連接字串同樣支援
Jet OLEDB:Database Password / pwd。
四、常見錯誤排查
| 錯誤訊息 | 原因 | 解決 |
Cannot initialize the data source object | 路徑錯誤/權限不足/Provider 未註冊 | 確認檔案路徑、SQL Server 服務帳號讀取權限、安裝 ACE 64-bit |
Not a valid password | 密碼關鍵字拼錯/編碼問題 | 依上表對應方式修正關鍵字 |
Provider cannot be found | 32/64 位不匹配 | 安裝對應位數 ACE Provider |
五、安全性建議
- 避免在連接字串明文寫死密碼 → 使用 Linked Server +
sp_addlinkedsrvlogin 指定專用登入帳號。
- Access 檔案本身加密(
Database Password)僅防誤開,**非高強度加密**,敏感資料請遷移至 SQL Server 本地表。
- 定期稽核
sys.linked_logins 與 sys.servers。
總結
掌握 pwd (OPENROWSET/Linked Server) 與 Jet OLEDB:Database Password (OPENDATASOURCE) 兩組關鍵字,即可在 SQL Server 透明存取加密 Access。64 位環境請務必改用 ACE Provider。建議將遷移腳本化、參數化,納入 CI/CD 流程。
- 上一篇文章: 標準 SQL 語句分類:DQL、DML、DDL、DCL、TCL 完整對照
- 下一篇文章: SQLite C/C++ 嵌入式開發實戰:32/64 位編譯與 API 核心流程
Copyright ©
程式碼之家 All Rights Reserved