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

SQL Server 跨資料庫查詢三大方法:三部分命名、OPENROWSET、跨資料庫所有權鏈結

     編輯:關於SqlServer

方法一:三部分命名 (同一實例內)

最簡單、效能最佳,格式:[資料庫名稱]..[資料表名稱]

SELECT * 
FROM [AAA]..TableA a 
INNER JOIN [BBB]..TableB b ON a.AccountID = b.ClientID;
限制: 僅限同一 SQL Server 實例內的資料庫。

方法二:OPENROWSET (跨實例/異構資料源)

啟用 Ad Hoc Distributed Queries

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 限制與解決方案

動態 SQL (EXEC/SP_EXECUTESQL) 下跨資料庫所有權鏈結失效,除非同一使用者存在於兩個資料庫。

SQL Server 2005+ 解決方案:憑證簽署存儲過程

-- 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設定複雜、需維護憑證
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved