SQL Azure 垂直Partitioned DB Query T-SQL範例
SQL Azure的連線字串雖然允許你在SQL工具上切換資料庫,但是其實要下Cross Database的T-SQL是沒有辦法允許的
因此我們需要利用Elastic database query + External Data Source來協助我們
以下假設我們有主資料庫 (A),與延伸資料庫(B)
在B的資料庫中
我們先建立以下的CREDENTIAL資訊
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '{A資料庫的密碼}';
CREATE DATABASE SCOPED CREDENTIAL ds_pool WITH IDENTITY = '{A資料庫的帳號}',SECRET = '{A資料庫的密碼}';
--以下語法提供方便重新建立/測試
--drop MASTER KEY --drop DATABASE SCOPED CREDENTIAL ds_pool
ds_pool不需要用字串包起來,你可以命名成你可理解的名稱,下面我們會再用到
執行成功的話,接著執行 以下建立Remote DataSource的物件
CREATE EXTERNAL DATA SOURCE REMOTE_DS WITH (
TYPE=RDBMS,
LOCATION='{A資料庫的Localtion}stage.database.windows.net',
DATABASE_NAME='{A資料庫的名稱}',
CREDENTIAL= ds_pool );
--以下語法提供方便重新建立/測試
--Drop EXTERNAL DATA SOURCE REMOTE_DS
這邊我們要給定一個REMOTEDS到DataSouce,並指定他的CREDENTIAL與資料庫名稱、類型與 Location,從MSDN上可以看到Location似乎可以支援檔案格式,可以填寫blob的位置,這個有機會再研究
CREATE EXTERNAL TABLE [dbo].[{A資料庫裡面的Table Or View都可以}]
( [A資料庫的某一個table的欄位1] [欄位型別1],
[A資料庫的某一個table的欄位2] [欄位型別2],
.....略
) WITH ( DATA_SOURCE = REMOTE_DS )
--drop EXTERNAL TABLE [dbo].[{A資料庫裡面的Table Or View都可以}]
select * from [dbo].[{A資料庫裡面的Table Or View都可以}]
這邊我們必須在B資料庫端,定義 A資料庫希望 remote存取的物件的schema,可以完整也可以只撈取部分~~端看需求,在B資料庫端,也可以給定一個新的別名,語法可以參考以下。
CREATE EXTERNAL TABLE [dbo].[remote_xxxxxx]
( [A資料庫的某一個table的欄位1] [欄位型別1],
[A資料庫的某一個table的欄位2] [欄位型別2],
.....略
) WITH (
DATA_SOURCE = REMOTE_DS
,SCHEMA_NAME = 'A資料庫裡面的Table Or View的schema,通常是dbo'
,OBJECT_NAME = '{A資料庫裡面的Table Or View}'
)
實測後,確實看起來是可以運作查詢,透過在B資料庫的連接中,直接查詢A
這與Elastic Pool似乎不一樣,而目前我們使用 到的費用也是包含在SQL Database中因此不另外計費
Currently, the elastic database query feature is included into the cost of your Azure SQL Database.
註1∶但是開一台elastic pool的主機,至少2000nt/月起跳…用途與解決問題的目的性應該不太一樣吧(沈思…)
註2∶若你的store procedure中有使用到External DataSource,語法中有使用With (nolock)的話,會出現 – “Table hints are not supported on queries that reference external tables”.的錯誤訊息
Reference
https://docs.microsoft.com/en-us/azure/azure-sql/database/elastic-query-getting-started-vertical