最簡單、效能最佳,格式:[資料庫名稱]..[資料表名稱]
SELECT *
FROM [AAA]..TableA a
INNER JOIN [BBB]..TableB b ON a.AccountID = b.ClientID;
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'Ad Hoc Distributed Queries', 1; RECONFIGURE;
SELECT *
FROM OPENROWSET(
'SQLNCLI',
'Server=遠端IP;UID=sa;PWD=密碼',
'資料庫名.dbo.資料表名'
);
EXEC sp_configure 'Ad Hoc Distributed Queries', 0; RECONFIGURE;
EXEC sp_configure 'show advanced options', 0; RECONFIGURE;
EXEC sp_configure 'cross db ownership chaining', 1; RECONFIGURE;
ALTER DATABASE 資料庫名 SET DB_CHAINING ON;
動態 SQL (EXEC/SP_EXECUTESQL) 下跨資料庫所有權鏈結失效,除非同一使用者存在於兩個資料庫。
-- 1. 建立憑證
CREATE CERTIFICATE CrossDBCert ENCRYPTION BY PASSWORD = 'StrongPwd'
WITH SUBJECT = 'Cross DB Access';
-- 2. 在目標資料庫建立使用者並授權
USE TargetDB;
CREATE USER CrossDBUser FROM CERTIFICATE CrossDBCert;
GRANT SELECT ON 目標表 TO CrossDBUser;
-- 3. 對存儲過程簽署
ADD SIGNATURE TO dbo.CrossDBProc BY CERTIFICATE CrossDBCert
WITH PASSWORD = 'StrongPwd';
| 場景 | 推薦方法 | 優點 | 缺點 |
|---|---|---|---|
| 同實例、固定資料庫 | 三部分命名 | 語法簡單、效能最好、計畫可重用 | 無法跨實例 |
| 跨實例/異構資料源、臨時查詢 | OPENROWSET | 彈性高、支援多種 Provider | 需開啟進階選項、安全風險、計畫難重用 |
| 固定跨資料庫存取、安全性要求高 | 所有權鏈結 + 憑證 | 安全、可控、支援動態 SQL | 設定複雜、需維護憑證 |