在DB同一伺服器, Azure SQL Server仍無法像一般SQL Server直接合併查詢不同資料庫的資料表。
在Azure需先在其中一個DB下,新增外部資料表,才能透過資料表進行查詢。
例如一個新專案建立一個新的資料庫,但需要引用USER資料庫的資料表,這時在新的資料庫建立外部資料表引用USER資料庫的某個資料表,才能在新資料庫合併查詢。
1.建立資料庫主要金鑰 MASTER KEY
CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'XXX@XXXXX'
2.建立資料庫連線認證
CREATE DATABASE SCOPED CREDENTIAL ConnectToUSERDB WITH
IDENTITY = '資料庫帳號',
SECRET = '資料庫密碼';
GO
3.建立資料來源
CREATE EXTERNAL DATA SOURCE USERDataSource
WITH
(
TYPE=RDBMS,
LOCATION='xxxxxx.database.windows.net',
DATABASE_NAME='USERDB', --目的的資料庫名稱
CREDENTIAL= ConnectToUSERDB --資料庫連線認證的名稱
);
資料來源建立後,可使用查詢指令確認是否能正常連線。
EXEC sp_execute_remote
N'USERDataSource',
N'SELECT DB_NAME()'
曾經因LOCATION名稱錯誤造成出現錯誤訊息。
Error retrieving data from shard [DataSource=xxxxx.database.windows.net Database=USERDB]. The underlying error message received was: 'A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 0 - No such host is known.)'.
4.建立延伸資料表
建立時,不能有PRIMARY KEY或DEFAULT值。
CREATE EXTERNAL TABLE [dbo].[TB_USER] (
[Id] INT NULL,
[USER_ID] NVARCHAR (50) NULL,
[USER_NAME] NVARCHAR (50) NULL,
[USER_DEPT] NVARCHAR (50) NULL,
[ROLE] NVARCHAR (50) NULL
) WITH
(
DATA_SOURCE=USERDataSource --資料來源的名稱
)
SELECT *
FROM TB_FORM_LIST A
LEFT JOIN TB_USER B ON A.REQUESTER_ID = B.USER_ID
