適用於:
Azure Data Factory
Azure Synapse Analytics
秘訣
Data Factory in Microsoft Fabric 是下一代的 Azure Data Factory,擁有更簡單的架構、內建 AI 及新功能。 如果你是資料整合新手,建議先從 Fabric Data Factory 開始。 現有的 ADF 工作負載可升級至 Fabric,以存取資料科學、即時分析與報告等新能力。
本文說明如何在 Azure Data Factory 或 Azure Synapse 管道中使用 Copy Activity 來從 Azure SQL Database 複製資料,並使用 Data Flow 在 Azure SQL Database 中轉換資料。 欲了解更多,請閱讀Azure Data Factory或Azure Synapse Analytics的介紹文章。
支援的功能
此 Azure SQL Database 連接器支援以下功能:
| 支援的功能 | IR | 受控私人端點 |
|---|---|---|
| 複製活動 (來源/接收) | (1) (2) | ✓ |
| 對應資料流 (來源/接收) | ① | ✓ |
| 查閱活動 | (1) (2) | ✓ |
| GetMetadata 活動 | (1) (2) | ✓ |
| 指令碼活動 | (1) (2) | ✓ |
| 預存程序活動 | (1) (2) | ✓ |
(1) Azure 整合執行時 (2) 自架整合執行時
對於 Copy activity,這個 Azure SQL Database 連接器支援以下功能:
- 使用 SQL 驗證及 Microsoft Entra 應用程式權杖驗證,搭配 Azure 資源的服務主體或受控識別來複製資料。
- 作為來源時,使用 SQL 查詢或預存程序來擷取資料。 你也可以選擇從Azure SQL Database來源平行複製,詳情請參見 從 SQL 資料庫 平行複製章節。
- 作為接收器,如果目的地資料表不存在,則會根據來源結構描述自動建立;在複製期間會將資料附加至資料表,或叫用具有自訂邏輯的預存程序。
如果你使用 Azure SQL Database serverless tier,請注意當伺服器暫停時,活動運行會失敗,而不是等待自動恢復完成。 您可以新增活動重試或鏈結其他活動,以確定伺服器在實際執行時為使用中。
重要事項
如果你使用 Azure 整合執行時複製資料,請設定一個 伺服器層級防火牆規則,讓Azure服務能夠存取伺服器。 如果您使用自我裝載整合執行階段來複製資料,請將防火牆設定為允許適當的 IP 範圍。 這個範圍包含用來連接 Azure SQL Database 的機器 IP。
開始
若要使用管線執行複製活動,您可以使用下列其中一個工具或 SDK:
使用 UI 建立一個 Azure SQL Database 連結服務
請依照以下步驟在 Azure 入口網站介面中建立一個與 Azure SQL Database 連結的服務。
請瀏覽 Azure Data Factory 或 Synapse 工作區的管理標籤,選擇連結服務,然後點選新建:
搜尋 SQL,並選擇 Azure SQL Database 連接器。
設定服務詳細資料,測試連線,然後建立新的連結服務。
連接器設定詳細資料
下列各節提供用來定義 Azure Data Factory 或 Synapse 管線實體中,Azure SQL Database 連接器專用屬性的詳細資訊。
連結服務屬性
Azure SQL Database連接器推薦版本支援 TLS 1.3。 請參考此 部分,將你的亞蘇爾 SQL 資料庫連接器版本從 Legacy 升級。 如需屬性詳細資料,請參閱對應的章節。
秘訣
如果你遇到錯誤代碼「UserErrorFailedToConnectToSqlServer」,且訊息如「資料庫的會話限制是 XXX 且已達成」,請在connection string中加上 Pooling=false 再試一次。
Pooling=false 也建議用於 SHIR(Self Hosted Integration Runtime) 類型的連結服務設定。 在連結服務建立表單的 [其他連線屬性] 區段中,您可以新增共用和其他連線參數作為新的參數名稱和值。
建議的版本
當你套用 Recommended版本時,這些通用屬性是支援於Azure SQL Database連結服務的:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 型別 | type 屬性必須設為 AzureSqlDatabase。 | 是 |
| 伺服器 | 您想要連線的 SQL Server 執行個體名稱或其網路位址。 | 是 |
| 資料庫 | 資料庫的名稱。 | 是 |
| authenticationType | 用於驗證的類型。 允許的值為 SQL (預設值)、ServicePrincipal、SystemAssignedManagedIdentity、UserAssignedManagedIdentity。 移至特定屬性和必要條件的相關驗證一節。 | 是 |
| alwaysEncryptedSettings | 指定 alwaysencryptedsettings 資訊,讓 Always Encrypted 能夠使用受控身分識別或服務主體來保護儲存在 SQL Server 的敏感性資料。 如需詳細資訊,請參閱表格下方的 JSON 範例和使用 Always Encrypted 一節。 如果未指定,則會停用預設的一律加密設定。 | 否 |
| 加密 | 指出用戶端與伺服器之間傳送的所有資料是否都需要 TLS 加密。 選項:強制 (若為 true,預設值)/選擇性 (若為 false)/strict。 | 否 |
| trustServerCertificate | 指出通道是否會加密,同時略過驗證信任的憑證鏈結。 | 否 |
| hostNameInCertificate | 針對連線驗證伺服器憑證時要使用的主機名稱。 未指定時,伺服器名稱會用於憑證驗證。 | 否 |
| connectVia | 用來連線到資料存放區的整合執行階段。 如果您的資料儲存在私人網路中,您可以使用 Azure 整合執行環境或自架整合執行環境。 若未指定,則使用預設的 Azure 整合執行環境。 | 否 |
如需其他連線屬性,請參閱下表:
| 屬性 | 描述 | 必要 |
|---|---|---|
| applicationIntent | 連線至伺服器時的應用程式工作負載類型。 允許值為:ReadOnly 和 ReadWrite。 |
否 |
| connectTimeout | 在終止嘗試連接到伺服器並產生錯誤之前,所等候的時間長度 (以秒為單位)。 | 否 |
| connectRetryCount | 識別到閒置連線失敗之後,嘗試重新連線的次數。 此值應為介於 0 到 255 之間的整數。 | 否 |
| connectRetryInterval | 識別閒置連線失敗之後,每次重新連線嘗試之間的時間 (以秒為單位)。 此值應為介於 1 到 60 之間的整數。 | 否 |
| loadBalanceTimeout | 在連線終結之前,連線在連線集區中存在的最短時間 (以秒為單位)。 | 否 |
| commandTimeout | 終止嘗試執行命令並產生錯誤之前的預設等候時間 (以秒為單位)。 | 否 |
| integratedSecurity | 允許的值為 true 或 false。 指定 false 時,指出是否已在連線中指定 userName 和 password。 在指定 true 時,表示是否使用目前的Windows帳號憑證進行驗證。 |
否 |
| failoverPartner | 主要伺服器已關閉時,待連線合作夥伴伺服器的名稱或位址。 | 否 |
| maxPoolSize | 特定連線的連線集區中允許的連線數目上限。 | 否 |
| minPoolSize | 特定連線的連線集區中允許的連線數目下限。 | 否 |
| multipleActiveResultSets | 允許的值為 true 或 false。 當您指定 true 時,應用程式可以維護多個使用中結果集 (MARS)。 當您指定 false 時,應用程式必須先處理或取消一個批次的所有結果集,才能在該連線上執行任何其他批次。 |
否 |
| multiSubnetFailover | 允許的值為 true 或 false。 如果您的應用程式連線至不同子網路上的 AlwaysOn 可用性群組 (AG),則將此屬性設定為 true 可以更快地偵測並連線到目前使用中的伺服器。 |
否 |
| packetSize | 伺服器執行個體通訊所使用的網路封包大小 (位元組)。 | 否 |
| 共用 | 允許的值為 true 或 false。 當您指定 true 時,連線會是集區式連線。 當您指定 false 時,每次要求連線時都會明確開啟連線。 |
否 |
SQL 驗證
若要使用 SQL 驗證,除了上一節所述的泛型屬性外,請指定下列屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| userName | 用來連線到伺服器的使用者名稱。 | 是 |
| 密碼 | 使用者名稱的密碼。 將此欄位標記為 SecureString 以將其安全地儲存。 或者,你可以引用儲存在 Azure Key Vault 中的秘密。 | 是 |
範例:使用 SQL 驗證
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"authenticationType": "SQL",
"userName": "<user name>",
"password": {
"type": "SecureString",
"value": "<password>"
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
範例:Azure Key Vault 中的密碼
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"authenticationType": "SQL",
"userName": "<user name>",
"password": {
"type": "AzureKeyVaultSecret",
"store": {
"referenceName": "<Azure Key Vault linked service name>",
"type": "LinkedServiceReference"
},
"secretName": "<secretName>"
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
範例:使用 Always Encrypted
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"authenticationType": "SQL",
"userName": "<user name>",
"password": {
"type": "SecureString",
"value": "<password>"
},
"alwaysEncryptedSettings": {
"alwaysEncryptedAkvAuthType": "ServicePrincipal",
"servicePrincipalId": "<service principal id>",
"servicePrincipalKey": {
"type": "SecureString",
"value": "<service principal key>"
}
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
服務主體驗證
若要使用服務主體驗證,除了上一節所述的一般屬性外,請指定下列屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| servicePrincipalId | 指定應用程式的用戶端識別碼。 | 是 |
| servicePrincipalCredential | 服務主體認證。 指定應用程式的金鑰。 將此欄位標記為 SecureString 以安全地儲存,或指向儲存在 Azure Key Vault 中的秘密。 | 是 |
| 用戶 | 指定您的應用程式所在租用戶的資訊,例如網域名稱或租用戶識別碼。 將滑鼠懸停在 Azure 傳送門的右上角即可取得。 | 是 |
| azureCloudType | 對於服務主體認證,請指定您的 Microsoft Entra 應用程式註冊到哪種 Azure 雲端環境類型。 允許的值為 AzurePublic、AzureChina、AzureUsGovernment 和 AzureGermany。 預設會使用 Data Factory 或 Synapse 管線的雲端環境。 |
否 |
此外,請依照下列步驟操作:
從Azure入口建立Microsoft Entra應用程式。 請記下應用程式名稱,以及下列可定義連結服務的值:
- 申請編號
- 應用程式金鑰
- 租用戶識別碼
如果您尚未完成,請先在 Azure 入口網站為您的伺服器佈建 Microsoft Entra 系統管理員。 Microsoft Entra 管理員必須是 Microsoft Entra 使用者或 Microsoft Entra 群組,但不能是服務主體。 執行此步驟的目的是讓您在下一步中,可以使用 Microsoft Entra 身分識別為服務主體建立內含資料庫使用者。
為服務主體建立自主資料庫使用者。 使用具有至少 ALTER ANY USER 權限的 Microsoft Entra 身分識別,透過 SQL Server Management Studio 等工具,連線到您要從中複製資料或複製資料至其中的資料庫。 執行下列 T-SQL:
CREATE USER [your application name] FROM EXTERNAL PROVIDER;如同您一般對 SQL 使用者或其他人所做的一樣,將所需的權限授與服務主體。 執行下列程式碼。 如需更多選項,請參閱此文件。
ALTER ROLE [role name] ADD MEMBER [your application name];喺 Azure Data Factory 或 Synapse workspace 中配置一個 Azure SQL Database 連結服務。
使用服務主體驗證的連結服務範例
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"hostNameInCertificate": "<host name>",
"authenticationType": "ServicePrincipal",
"servicePrincipalId": "<service principal id>",
"servicePrincipalCredential": {
"type": "SecureString",
"value": "<application key>"
},
"tenant": "<tenant info, e.g. microsoft.onmicrosoft.com>"
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
系統指派的受控身分識別驗證
資料工廠或 Synapse 工作空間可以與代表 Azure 資源的系統指派的受控身分識別關聯,此受控身分識別在 Azure 中進行其他資源的身份驗證時代表該服務。 你可以用這個管理身份來進行 Azure SQL Database 認證。 指定的處理站或 Synapse 工作區可以使用此身分識別從您的資料庫存取資料,或來回複製您資料庫中的資料。
若要使用系統指派的受控識別驗證,請指定上一節所述的一般屬性,並依照下列步驟操作。
如果您尚未完成,請先在 Azure 入口網站為您的伺服器佈建 Microsoft Entra 系統管理員。 Microsoft Entra 管理員可以是 Microsoft Entra 使用者或 Microsoft Entra 群組。 如果您授與受控識別系統管理員角色,請略過步驟 3 和 4。 系統管理員擁有資料庫的完整存取權。
為受控身分識別建立自主資料庫使用者。 使用具有至少 ALTER ANY USER 權限的 Microsoft Entra 身分識別,透過 SQL Server Management Studio 等工具,連線到您要從中複製資料或複製資料至其中的資料庫。 執行下列 T-SQL:
CREATE USER [your_resource_name] FROM EXTERNAL PROVIDER;依照您平常為 SQL 使用者和其他人所進行的作業一樣,授與受控身分識別所需的權限。 執行下列程式碼。 如需更多選項,請參閱此文件。
ALTER ROLE [role name] ADD MEMBER [your_resource_name];配置一個 Azure SQL Database 連結服務。
範例
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"authenticationType": "SystemAssignedManagedIdentity"
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
使用者指派的受控身分識別驗證
資料工廠或 Synapse 工作區可以與由 user 指派的管理身份 綁定,該身份在 Azure 中驗證其他資源時代表該服務。 你可以用這個管理身份來進行 Azure SQL Database 認證。 指定的處理站或 Synapse 工作區可以使用此身分識別從您的資料庫存取資料,或來回複製您資料庫中的資料。
若要使用使用者指派的受控識別驗證,除了上一節所述的一般屬性外,請指定下列屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 憑證 | 將使用者指派的受控身分識別指定為認證物件。 | 是 |
此外,請依照下列步驟操作:
如果您尚未完成,請先在 Azure 入口網站為您的伺服器佈建 Microsoft Entra 系統管理員。 Microsoft Entra 管理員可以是 Microsoft Entra 使用者或 Microsoft Entra 群組。 如果您為具有使用者指派的受控身分識別的群組授與系統管理員角色,請略過步驟 3。 系統管理員擁有資料庫的完整存取權。
為使用者指派的受控身分識別建立自主資料庫使用者。 使用具有至少 ALTER ANY USER 權限的 Microsoft Entra 身分識別,透過 SQL Server Management Studio 等工具,連線到您要從中複製資料或複製資料至其中的資料庫。 執行下列 T-SQL:
CREATE USER [your_resource_name] FROM EXTERNAL PROVIDER;依照您平常為 SQL 使用者和其他人所進行的作業一樣,建立一或多個使用者指派的受控身分識別,並授與使用者指派的受控身分識別所需的權限。 執行下列程式碼。 如需更多選項,請參閱此文件。
ALTER ROLE [role name] ADD MEMBER [your_resource_name];將一或多個使用者指派的受控身分識別指派給資料處理站,並為每個使用者指派的受控身分識別建立認證。
配置一個 Azure SQL Database 連結服務。
範例
{
"name": "AzureSqlDbLinkedService",
"properties": {
"type": "AzureSqlDatabase",
"typeProperties": {
"server": "<name or network address of the SQL server instance>",
"database": "<database name>",
"encrypt": "<encrypt>",
"trustServerCertificate": false,
"authenticationType": "UserAssignedManagedIdentity",
"credential": {
"referenceName": "credential1",
"type": "CredentialReference"
}
},
"connectVia": {
"referenceName": "<name of Integration Runtime>",
"type": "IntegrationRuntimeReference"
}
}
}
舊版
當你套用 Legacy版本時,這些通用屬性是支援於Azure SQL Database連結服務的:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 型別 | type 屬性必須設為 AzureSqlDatabase。 | 是 |
| connectionString | 指定連接 Azure SQL Database 實例所需的資訊,以符合 connectionString 屬性。 你也可以在 Azure Key Vault 放置密碼或服務主鍵。 如果是 SQL 認證,請從 connection string 中移除 password 設定。 欲了解更多資訊,請參閱在 Azure Key Vault 中存儲憑證。 |
是 |
| alwaysEncryptedSettings | 指定 alwaysencryptedsettings 資訊,讓 Always Encrypted 能夠使用受控身分識別或服務主體來保護儲存在 SQL Server 的敏感性資料。 如需詳細資訊,請參閱使用 Always Encrypted 一節。 如果未指定,則會停用預設的一律加密設定。 | 否 |
| connectVia | 用來連線到資料存放區的整合執行階段。 如果您的資料儲存在私人網路中,您可以使用 Azure 整合執行環境或自架整合執行環境。 若未指定,則使用預設的 Azure 整合執行環境。 | 否 |
針對不同的驗證類型,請分別參閱下列各節特定的屬性和必要條件:
舊版的 SQL 驗證
若要使用 SQL 驗證,請指定上一節所述的泛型屬性。
舊版的服務主體驗證
若要使用服務主體驗證,除了上一節所述的一般屬性外,請指定下列屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| servicePrincipalId | 指定應用程式的用戶端識別碼。 | 是 |
| servicePrincipalKey | 指定應用程式的金鑰。 將此欄位標記為 SecureString以安全儲存,或引用儲存在 Azure Key Vault 中的秘密。 | 是 |
| 用戶 | 指定您的應用程式所在租用戶的資訊,例如網域名稱或租用戶識別碼。 將滑鼠懸停在 Azure 傳送門的右上角即可取得。 | 是 |
| azureCloudType | 對於服務主體認證,請指定您的 Microsoft Entra 應用程式註冊到哪種 Azure 雲端環境類型。 允許的值為 AzurePublic、AzureChina、AzureUsGovernment 和 AzureGermany。 預設會使用 Data Factory 或 Synapse 管線的雲端環境。 |
否 |
您也需要遵循服務主體驗證中的步驟來授與對應的授權。
舊版的系統指派受控識別驗證
如果要使用系統指派的受控識別驗證,請遵循系統指派的受控識別驗證中建議版本的相同步驟。
舊版使用者指派的受控識別驗證
如果要使用使用者指派的受控識別驗證,請遵循使用者指派的受控識別驗證中建議版本的相同步驟。
資料集屬性
如需可用來定義資料集的完整區段和屬性清單,請參閱資料集。
Azure SQL Database 資料集支援以下屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 型別 | 資料集的 type 屬性必須設定為 AzureSqlTable。 | 是 |
| 結構描述 | 結構描述的名稱。 | 否 (來源);是 (接收) |
| 表格 | 資料表/檢視的名稱。 | 否 (來源);是 (接收) |
| tableName | 具有結構描述的資料表/檢視名稱。 支援此屬性是基於回溯相容性。 對於新的工作負載,請使用 schema 和 table。 |
否 (來源);是 (接收) |
資料集屬性範例
{
"name": "AzureSQLDbDataset",
"properties":
{
"type": "AzureSqlTable",
"linkedServiceName": {
"referenceName": "<Azure SQL Database linked service name>",
"type": "LinkedServiceReference"
},
"schema": [ < physical schema, optional, retrievable during authoring > ],
"typeProperties": {
"schema": "<schema_name>",
"table": "<table_name>"
}
}
}
複製活動屬性
如需可用來定義活動的區段和屬性完整清單,請參閱管線。 本節提供 Azure SQL Database 來源與匯項所支援的屬性清單。
Azure SQL Database 作為來源
秘訣
若要透過資料分區有效地從 Azure SQL Database 載入資料,請參考SQL 資料庫平行複製。
要從Azure SQL Database複製資料,複製活動來源區塊支援以下屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 型別 | 複製活動來源的 type 屬性必須設定為 AzureSqlSource。 回溯相容性仍然支援 "SqlSource" 類型。 | 是 |
| sqlReaderQuery | 此屬性使用自訂 SQL 查詢來讀取資料。 例如 select * from MyTable。 |
否 |
| sqlReaderStoredProcedureName | 從來源資料表讀取資料的預存程序名稱。 最後一個 SQL 陳述式必須是預存程序中的 SELECT 陳述式。 | 否 |
| storedProcedureParameters | 預存程序的參數。 允許的值為名稱或值組。 參數的名稱和大小寫必須符合預存程序參數的名稱和大小寫。 |
否 |
| isolationLevel | 指定 SQL 來源的異動鎖定行為。 允許的值為:ReadCommitted、ReadUncommitted、RepeatableRead、Serializable、Snapshot。 如果未指定,則會使用資料庫的預設隔離等級。 如需詳細資訊,請參閱這篇文件。 | 否 |
| partitionOptions | 指定用於從 Azure SQL Database 載入資料的資料分割選項。 允許的值為:None (預設值)、PhysicalPartitionsOfTable 和 DynamicRange。 當分割區選項啟用(即非 None)時,從Azure SQL Database同時載入資料的平行程度由複製活動中的parallelCopies設定控制。 |
否 |
| partitionSettings | 指定資料分割的設定群組。 當分割選項不是 None 時套用。 |
否 |
在 partitionSettings 底下: |
||
| partitionColumnName | 以整數類型或日期/日期時間類型 (int、smallint、bigint、date、smalldatetime、datetime、datetime2 或 datetimeoffset) 指定來源資料行的名稱,供平行複製的範圍分割使用。 如果未指定,則會自動偵測資料表的索引或主索引鍵作為分割資料行。當分割選項是 DynamicRange 時套用。 如果您使用查詢來取出來源資料,請在 WHERE 子句中加上 ?DfDynamicRangePartitionCondition 。 如需範例,請參閱從 SQL 資料庫平行複製一節。 |
否 |
| partitionUpperBound | 分割區範圍分割的分割區資料行最大值。 這個值用於決定分割區的跨距,而不是用於篩選資料表中的資料列。 資料表或查詢結果中的所有資料列都會進行分割和複製。 如果未指定,複製活動會自動偵測該值。 當分割選項是 DynamicRange 時套用。 如需範例,請參閱從 SQL 資料庫平行複製一節。 |
否 |
| partitionLowerBound | 分割區範圍分割的分割區資料行最小值。 這個值用於決定分割區的跨距,而不是用於篩選資料表中的資料列。 資料表或查詢結果中的所有資料列都會進行分割和複製。 如果未指定,複製活動會自動偵測該值。 當分割選項是 DynamicRange 時套用。 如需範例,請參閱從 SQL 資料庫平行複製一節。 |
否 |
請注意下列幾點:
- 如果
sqlReaderQuery 是為AzureSqlSource 指定的,複製活動會對 Azure SQL Database 來源執行此查詢以取得資料。 如果預存程序接受參數,您也可以藉由指定 sqlReaderStoredProcedureName 和 storedProcedureParameters 來指定預存程序。 - 在來源中使用預存程序來擷取資料時,請注意,如果您的預存程序設計為在傳入不同的參數值時傳回不同的結構描述,在從 UI 匯入結構描述,或使用自動資料表建立將資料複製到 SQL 資料庫時,您可能遇到失敗,或看到非預期的結果。
SQL 查詢範例
"activities":[
{
"name": "CopyFromAzureSQLDatabase",
"type": "Copy",
"inputs": [
{
"referenceName": "<Azure SQL Database input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "AzureSqlSource",
"sqlReaderQuery": "SELECT * FROM MyTable"
},
"sink": {
"type": "<sink type>"
}
}
}
]
預存程序範例
"activities":[
{
"name": "CopyFromAzureSQLDatabase",
"type": "Copy",
"inputs": [
{
"referenceName": "<Azure SQL Database input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "AzureSqlSource",
"sqlReaderStoredProcedureName": "CopyTestSrcStoredProcedureWithParameters",
"storedProcedureParameters": {
"stringData": { "value": "str3" },
"identifier": { "value": "$$Text.Format('{0:yyyy}', <datetime parameter>)", "type": "Int"}
}
},
"sink": {
"type": "<sink type>"
}
}
}
]
預存程序定義
CREATE PROCEDURE CopyTestSrcStoredProcedureWithParameters
(
@stringData varchar(20),
@identifier int
)
AS
SET NOCOUNT ON;
BEGIN
select *
from dbo.UnitTestSrcTable
where dbo.UnitTestSrcTable.stringData != stringData
and dbo.UnitTestSrcTable.identifier != identifier
END
GO
Azure SQL Database 作為數據匯入端
秘訣
請進一步了解最佳實務中載入資料至 Azure SQL Database 的支援寫入行為、設定與最佳實務。
要將資料複製到Azure SQL Database,複製活動sink區塊支援以下屬性:
| 屬性 | 描述 | 必要 |
|---|---|---|
| 型別 | 複製活動接收器的 type 屬性必須設定為 AzureSqlSink。 回溯相容性仍然支援 "SqlSink" 類型。 | 是 |
| preCopyScript | 在將資料寫入 Azure SQL Database 之前,先指定一個 SQL 查詢來執行複製活動。 每一複製回合只會叫用此查詢一次。 使用此屬性來清除預先載入的資料。 | 否 |
| tableOption | 指定是否要根據來源結構描述,自動建立接收資料表 (如果不存在)。 當接收指定預存程序時,不支援自動建立資料表。 允許的值包為: none (預設) 或 autoCreate。 |
否 |
| sqlWriterStoredProcedureName | 定義如何將來源資料套用到目標資料表的預存程序名稱。 此預存程序將會依批次叫用。 針對只執行一次且與來源資料無關的作業 (例如刪除或截斷),請使用 preCopyScript 屬性。請參閱叫用 SQL 接收器中的預存程序的範例。 |
否 |
| storedProcedureTableTypeParameterName | 預存程序中指定資料表類型的參數名稱。 | 否 |
| sqlWriterTableType | 在預存程序中使用的資料表類型名稱。 複製活動可讓正在移動的資料可用於此資料表類型的暫存資料表。 然後,預存程序程式碼可以合併正在複製的資料與現有的資料。 | 否 |
| storedProcedureParameters | 預存程序的參數。 允許的值為:名稱和值組。 參數的名稱和大小寫必須符合預存程序參數的名稱和大小寫。 |
否 |
| writeBatchSize | 針對「每個批次」要插入 SQL 資料表中的資料列數。 允許的值為整數 (資料列數目)。 根據預設,服務會依據資料列大小動態決定適當的批次大小。 |
否 |
| writeBatchTimeout | 在逾時之前等待插入、upsert 和預存程式作業完成的時間。 允許的值為時間範圍。 例如 “00:30:00” 為 30 分鐘。 如果未指定任何值,逾時預設為 "00:30:00"。 |
否 |
| disableMetricsCollection | 該服務收集如 Azure SQL Database DTU 等指標,用於複製效能優化與推薦,這也引入了額外的主資料庫存取權限。 如果您擔心此行為,請指定 true 將其關閉。 |
否 (預設值為 false) |
| maxConcurrentConnections | 在活動執行期間建立至資料存放區的同時連線上限。 僅在想要限制並行連線時,才需要指定值。 | 否 |
| WriteBehavior | 指定複製活動的寫入行為,以將資料載入 Azure SQL Database。 允許的值為 Insert 和 Upsert。 根據預設,服務會使用 Insert 載入資料。 |
否 |
| upsertSettings | 指定寫入行為的設定群組。 當 WriteBehavior 選項為 Upsert 時套用。 |
否 |
在 upsertSettings 底下: |
||
| useTempDB | 指定是否要使用全域暫存資料表或實體資料表作為 upsert 的過渡資料表。 根據預設,服務會使用全域暫存資料表作為過度資料表。 值為 true。 |
否 |
| interimSchemaName | 如果使用實體資料表,請指定建立過渡資料表的過渡結構描述。 注意:使用者必須具有建立和刪除資料表的權限。 根據預設,過渡資料表會與接收資料表共用相同的結構描述。 當 useTempDB 選項為 False 套用。 |
否 |
| 金鑰 | 指定唯一資料列識別的資料行名稱。 您可以使用單一索引鍵或一系列索引鍵。 如果未指定,則會使用主索引鍵。 | 否 |
範例 1:附加資料
"activities":[
{
"name": "CopyToAzureSQLDatabase",
"type": "Copy",
"inputs": [
{
"referenceName": "<input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<Azure SQL Database output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "<source type>"
},
"sink": {
"type": "AzureSqlSink",
"tableOption": "autoCreate",
"writeBatchSize": 100000
}
}
}
]
範例 2:在複製期間叫用預存程序
若要了解更多詳細資料,請參閱叫用 SQL 接收中的預存程序。
"activities":[
{
"name": "CopyToAzureSQLDatabase",
"type": "Copy",
"inputs": [
{
"referenceName": "<input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<Azure SQL Database output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "<source type>"
},
"sink": {
"type": "AzureSqlSink",
"sqlWriterStoredProcedureName": "CopyTestStoredProcedureWithParameters",
"storedProcedureTableTypeParameterName": "MyTable",
"sqlWriterTableType": "MyTableType",
"storedProcedureParameters": {
"identifier": { "value": "1", "type": "Int" },
"stringData": { "value": "str1" }
}
}
}
}
]
範例 3:Upsert 資料
"activities":[
{
"name": "CopyToAzureSQLDatabase",
"type": "Copy",
"inputs": [
{
"referenceName": "<input dataset name>",
"type": "DatasetReference"
}
],
"outputs": [
{
"referenceName": "<Azure SQL Database output dataset name>",
"type": "DatasetReference"
}
],
"typeProperties": {
"source": {
"type": "<source type>"
},
"sink": {
"type": "AzureSqlSink",
"tableOption": "autoCreate",
"writeBehavior": "upsert",
"upsertSettings": {
"useTempDB": true,
"keys": [
"<column name>"
]
},
}
}
}
]
從 SQL 資料庫平行複製
Azure SQL Database 的複製活動連接器提供內建的資料分割功能,以平行複製資料。 您可以在複製活動的 [來源] 索引標籤上找到資料分割選項。
啟用分割複製時,複製活動會對你的 Azure SQL Database 來源執行平行查詢,以分區載入資料。 平行程度由複製活動的 parallelCopies 設定所控制。 例如,如果你將 parallelCopies 設為四,服務會根據你指定的分割選項和設定同時產生並執行四個查詢,每個查詢都會從你的Azure SQL Database中擷取部分資料。
建議你啟用平行複製並啟用資料分割,特別是當你從 Azure SQL Database 載入大量資料時。 以下針對各種情節的建議設定。 將資料複製到以檔案為基礎的資料存放區時,建議分成多個檔案來寫入資料夾 (僅指定資料夾名稱),這樣效能會比寫入單一檔案更好。
| 狀況 | 建議的設定 |
|---|---|
| 使用實體分割區從大型資料表完整載入。 |
分割選項:資料表的實體分割區。 在執行期間,服務會自動偵測實體分割區,並依分割區複製資料。 若要檢查您的資料表是否有實體分割區,您可以參考此查詢。 |
| 從大型資料表完整載入,不含實體分割區,同時在資料分割時包含整數或日期時間資料行。 |
分割選項:動態範圍分割。 分割資料行 (選用):指定用來分割資料的資料行。 如果未指定,則會使用索引或主索引鍵資料行。 分割區上限和分割區下限 (選用):指定是否要決定分割區跨距。 這不適用於篩選資料表中的資料列,資料表中的所有資料列都會分割並複製。 如果未指定,複製活動會自動偵測值。 例如,如果您的分割區資料行「識別碼」具有範圍 1 到 100 之間的值,而您將下限設定為 20、上限設定為 80,且平行複製為 4,則服務會分別依 4 個分割區擷取資料 - 範圍中的識別碼分別為 <=20、[21, 50]、[51, 80] 和 >=81。 |
| 使用自訂查詢載入大量資料,不使用實體分割區,同時包含整數或日期/日期時間資料行用於資料分割。 |
分割選項:動態範圍分割。 查詢: SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>。分割資料行:指定用來分割資料的資料行。 分割區上限和分割區下限 (選用):指定是否要決定分割區跨距。 這不適用於篩選資料表中的資料列,查詢結果中的所有資料列都會分割並複製。 如果未指定,複製活動會自動偵測該值。 例如,如果您的分割區資料行「識別碼」具有範圍 1 到 100 之間的值,而您將下限設定為 20、上限設定為 80,且平行複製為 4,則服務會分別依 4 個分割區擷取資料 - 範圍中的識別碼分別為 <=20、[21, 50]、[51, 80] 和 >=81。 以下是不同案例的更多範例查詢: 1. 查詢整個資料表: SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition2. 來自具有資料行選取範圍和其他 where 子句篩選的資料表查詢: SELECT <column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>3. 使用子查詢的查詢: SELECT <column_list> FROM (<your_sub_query>) AS T WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>4. 在子查詢中使用分割區的查詢: SELECT <column_list> FROM (SELECT <your_sub_query_column_list> FROM <TableName> WHERE ?DfDynamicRangePartitionCondition) AS T |
使用分割區選項載入資料的最佳做法:
- 選擇獨特的資料行作為分割資料行 (例如主索引鍵或唯一索引鍵) 以避免資料扭曲。
- 如果資料表有內建分割區,請使用分割選項「資料表的實體分割區」,以獲得更佳的效能。
- 如果你用 Azure Integration Runtime 複製資料,可以設定較大的「Data Integration Units (DIU)」(>4)來利用更多運算資源。 檢查該處適用的案例。
- 「複製平行處理原則的程度」會控制分割區數目,將此數目設定過大有時會損害效能,建議將此數目設定為 (DIU 或自我裝載 IR 節點數目) * (2 到 4)。
範例:使用實體分割區從大型資料表完整載入
"source": {
"type": "AzureSqlSource",
"partitionOption": "PhysicalPartitionsOfTable"
}
範例:使用動態範圍分割進行查詢
"source": {
"type": "AzureSqlSource",
"query": "SELECT * FROM <TableName> WHERE ?DfDynamicRangePartitionCondition AND <your_additional_where_clause>",
"partitionOption": "DynamicRange",
"partitionSettings": {
"partitionColumnName": "<partition_column_name>",
"partitionUpperBound": "<upper_value_of_partition_column (optional) to decide the partition stride, not as data filter>",
"partitionLowerBound": "<lower_value_of_partition_column (optional) to decide the partition stride, not as data filter>"
}
}
用來檢查實體分割區的範例查詢
SELECT DISTINCT s.name AS SchemaName, t.name AS TableName, pf.name AS PartitionFunctionName, c.name AS ColumnName, iif(pf.name is null, 'no', 'yes') AS HasPartition
FROM sys.tables AS t
LEFT JOIN sys.objects AS o ON t.object_id = o.object_id
LEFT JOIN sys.schemas AS s ON o.schema_id = s.schema_id
LEFT JOIN sys.indexes AS i ON t.object_id = i.object_id
LEFT JOIN sys.index_columns AS ic ON ic.partition_ordinal > 0 AND ic.index_id = i.index_id AND ic.object_id = t.object_id
LEFT JOIN sys.columns AS c ON c.object_id = ic.object_id AND c.column_id = ic.column_id
LEFT JOIN sys.partition_schemes ps ON i.data_space_id = ps.data_space_id
LEFT JOIN sys.partition_functions pf ON pf.function_id = ps.function_id
WHERE s.name='[your schema]' AND t.name = '[your table name]'
如果資料表具有實體分割區,您會看到 “HasPartition” 顯示為 “yes”,如下所示。
將資料載入 Azure SQL Database 的最佳實務
當你將資料複製到 Azure SQL Database 時,可能需要不同的寫入行為:
請參閱如何在服務和最佳做法中設定的各節。
附加資料
附加資料是這個 Azure SQL Database sink 連接器的預設行為。 服務會執行大量插入,以有效率地寫入資料表。 您可以在複製活動中據以設定來源和接收器。
更新插入資料
複製活動現在原生支援先將資料載入資料庫暫存資料表,然後在索引鍵存在時更新接收資料表中的資料,否則插入新資料。 若要深入了解複製活動中的 upsert 設定,請參閱 Azure SQL Database 作為接收器。
覆寫整個資料表
您可以在複製活動接收器中設定 preCopyScript 屬性。 在此情況下,針對執行的每個複製活動,服務會先執行指令碼。 然後服務會執行複本以插入資料。 例如,若要以最新的資料覆寫整個資料表,可以指定先刪除所有記錄,再從來源大量載入新資料的指令碼。
使用自訂邏輯寫入資料
使用自訂邏輯寫入資料的步驟類似於 Upsert 資料一節中所述的步驟。 當您需要在將來源資料最終插入目的地資料表之前套用額外處理時,您可以先載入至暫存資料表,再調用預存程序活動;或是在複製活動接收器中調用預存程序以套用資料;也可以使用 Mapping Data Flow。
從 SQL 接收叫用預存程序
當你將資料複製到 Azure SQL Database 時,你也可以設定並呼叫使用者指定的儲存程序,並在每個來源資料表的批次上加入額外參數。 預存程序功能使用資料表值參數。
當內建的複製機制無法滿足需求時,您可以使用預存程序。 例如,當您想要在最終插入來源資料至目的地資料表之前,套用額外的處理。 額外處理的一些範例包括:合併資料行、查閱其他的值,以及插入多個資料表中。
以下範例展示了如何使用預存程序將資料插入或更新到 Azure SQL Database 中的資料表。 假設輸入資料和接收 Marketing 資料表各有三個資料行:ProfileID、State 和 Category。 根據 ProfileID 資料行執行更新插入,然後僅套用至名為 "ProductA" 的特定類別。
在資料庫中,使用與 sqlWriterTableType 相同的名稱來定義資料表類型。 資料表類型的結構描述會與輸入資料所傳回的結構描述相同。
CREATE TYPE [dbo].[MarketingType] AS TABLE( [ProfileID] [varchar](256) NOT NULL, [State] [varchar](256) NOT NULL, [Category] [varchar](256) NOT NULL )在資料庫中,使用與 sqlWriterStoredProcedureName 相同的名稱來定義預存程序。 它會處理來自指定來源的輸入資料,並合併至輸出資料表。 預存程序中資料表類型的參數名稱會與資料集中定義的 tableName 相同。
CREATE PROCEDURE spOverwriteMarketing @Marketing [dbo].[MarketingType] READONLY, @category varchar(256) AS BEGIN MERGE [dbo].[Marketing] AS target USING @Marketing AS source ON (target.ProfileID = source.ProfileID and target.Category = @category) WHEN MATCHED THEN UPDATE SET State = source.State WHEN NOT MATCHED THEN INSERT (ProfileID, State, Category) VALUES (source.ProfileID, source.State, source.Category); END在你的 Azure Data Factory 或 Synapse 管線中,請定義複製活動中的 SQL sink 區段如下:
"sink": { "type": "AzureSqlSink", "sqlWriterStoredProcedureName": "spOverwriteMarketing", "storedProcedureTableTypeParameterName": "Marketing", "sqlWriterTableType": "MarketingType", "storedProcedureParameters": { "category": { "value": "ProductA" } } }
當您使用預存程序將資料寫入 Azure SQL Database 時,接收器會將來源資料分成小批次後再插入,因此預存程序中的額外查詢可能會執行多次。 如果您需要在將資料寫入 Azure SQL Database 之前執行複製活動的查詢,建議不要將其加入儲存程序中,而是應放在 Pre-copy script 欄位。
對應資料流程屬性
在映射資料流中轉換資料時,你可以從 Azure SQL Database 讀取和寫入資料表。 如需詳細資訊,請參閱對應資料流程中的來源轉換和接收轉換。
來源轉換
針對Azure SQL Database的專屬設定可在來源轉換的Source Options分頁中提供。
輸入 選取您是要將來源指向資料表 (相當於 Select * from <table-name>) 或輸入自訂的 SQL 查詢。
查詢:如果您在 [輸入] 欄位中選取 [查詢],請對於來源輸入 SQL 查詢。 此設定會覆寫您在資料集中選擇的任何資料表。 這裡不支援 Order By 子句,但您可以設定完整的 SELECT FROM 陳述式。 您也可使用使用者定義的資料表函數。 select * from udfGetData() 是 SQL 中傳回資料表的 UDF。 此查詢會產生您可以在資料流程中使用的來源資料表。 使用查詢也是縮減資料列以進行測試或查閱的絕佳方式。
秘訣
對應資料流程 [查詢] 模式不支援 SQL 的通用資料表運算式 (CTE),因為使用此模式的必要條件是查詢可用於 SQL 查詢 FROM 子句,但 CTE 不適用。 若要使用 CTE,您必須使用下列查詢來建立預存程序:
CREATE PROC CTESP @query nvarchar(max)
AS
BEGIN
EXECUTE sp_executesql @query;
END
然後在對應資料流程的來源轉換中使用 [預存程序] 模式,並依照範例 @query 設定 with CTE as (select 'test' as a) select * from CTE。 接著您便可以正常使用 CTE。
預存程序:如果您想要透過從來源資料庫執行的預存程序來產生投影和來源資料,則請選擇此選項。 您可以輸入結構描述、程序名稱和參數,或按一下 [重新整理] 以要求服務探索結構描述和程序名稱。 然後,您可以按一下 [匯入],以使用 @paraName 形式匯入所有程序參數。
- SQL 範例:
Select * from MyTable where customerId > 1000 and customerId < 2000 - 參數化 SQL 範例:
"select * from {$tablename} where orderyear > {$year}"
批次大小:輸入批次大小,將大型資料區塊化為讀取。
隔離等級:對應資料流程中 SQL 來源的預設值為「未認可」。 您可以在這裡將隔離等級變更為下列其中一個值:
- 讀取認可
- 讀取未認可
- 可重複讀取
- 可序列化
- None (忽略隔離等級)
啟用累加擷取:使用此選項可告訴 ADF 只處理自上次執行管線後變更的資料列。 若要使用結構描述漂移啟用累加式擷取,請選擇以累加/浮水印資料行為基礎的資料表,而不是為了原生異動資料擷取而啟用的資料表。
累加資料行:使用累加擷取功能時,您必須選擇想要在來源資料表中用作浮水印的日期/時間或數值資料行。
啟用原生異動資料擷取功能 (預覽):使用此選項可指示 ADF 只處理自上次執行管線以來,SQL 異動資料擷取技術所擷取的差異資料。 使用此選項時,會自動載入差異資料 (包括資料列插入、更新和刪除),而不需要任何累加資料行。 你需要先在 >
從頭開始讀取:使用累加擷取設定此選項,會指示 ADF 在第一次執行管線時讀取所有資料列,並開啟累加擷取。
接收轉換
Azure SQL Database專用設定可在水槽變形的Settings標籤中取得。
Update 方法:決定您的資料庫目的地所允許的作業。 預設僅允許插入。 若要更新、upsert 或刪除資料列,必須使用 alter-row 轉換來標記這些動作的資料列。 對於更新、更新插入和刪除,必須設定索引鍵資料行,以決定要改變哪一個資料列。
在後續更新、Upsert、刪除期間,服務將會使用您在這裡挑選作為索引鍵的資料行名稱。 因此,您必須挑選存在於接收器對應中的資料行。 如果您不想要將值寫入至此索引鍵資料行,則請按一下 [跳過寫入索引鍵資料行]。
你可以參數化這裡用來更新目標 Azure SQL Database 資料表的鍵欄位。 如果您的複合索引鍵有多個資料行,則請按一下 [自訂運算式],您就可以使用資料流程運算式語言來新增動態內容,其中包括具有複合索引鍵資料行名稱的字串陣列。
資料表動作: 決定在寫入之前,是否要重新建立或移除目的地資料表中的所有資料列。
- 無:資料表不會執行任何動作。
- 重新建立:資料表會遭到捨棄並重新建立。 如果要動態建立新的資料表,則為必要。
- 截斷:系統將會移除目標資料表中的所有資料列。
批次大小:控制要在每個值區中寫入的資料列數目。 較大的批次大小會改善壓縮和記憶體優化,但會導致在快取資料時發生記憶體例外狀況的風險。
使用 TempDB:根據預設,在載入程序期間,服務將會使用全域暫存資料表來儲存資料。 或者,您可以取消核取 [使用 TempDB] 選項,並改為要求服務將暫存持有資料表儲存至使用者資料庫,而此使用者資料庫位於用於此接收器的資料庫中。
前置和後置 SQL 指令碼:輸入將在寫入至您的接收資料庫之前 (前置處理) 和之後 (後置處理) 將執行的多行 SQL 指令碼
秘訣
- 建議將含有多個命令的單一批次指令碼分成多個批次。
- 只有傳回簡單更新計數的資料定義語言 (DDL) 和資料操作語言 (DML) 陳述式可以當作批次的一部份來執行。 若要深入了解,請參閱執行批次作業
處理資料列時發生錯誤
當寫入 Azure SQL DB 時,某些資料列可能因目的地設定的限制而失敗。 部分常見錯誤包括:
- 資料表中的字串或二進位資料會遭到截斷
- 無法將 NULL 值插入資料行
- INSERT 陳述式與 CHECK 條件約束衝突
根據預設,資料流程執行會在它遇到的第一個錯誤時失敗。 您可以選擇 [發生錯誤時繼續],讓您的資料流程即使在個別資料列發生錯誤時也能夠完成。 該服務會提供不同的選項,讓您處理這些錯誤資料列。
交易認可:選擇您的資料是以單一交易或批次寫入。 單一交易將會提供較差的效能,但在交易完成之前,其他人看不到寫入的資料。
Output rejected data: 如果啟用此功能,你可以將錯誤列輸出成 Azure Blob Storage 中的 csv 檔案,或你選擇的 Azure Data Lake Storage Gen2 儲存體。 這會寫入含有三個額外資料行的錯誤資料列:INSERT 或 UPDATE 之類的 SQL 作業、資料流程錯誤碼,以及資料列上的錯誤訊息。
發生錯誤時回報成功:如果啟用,即使找到發生錯誤的資料列,資料流程也會標示為成功。
Azure SQL Database 的資料類型對應
當資料從或複製到Azure SQL Database時,會使用以下從Azure SQL Database資料型態到Azure Data Factory中間資料型態的映射。 Synapse 管線功能也使用相同的映射,該功能直接實作 Azure Data Factory。 若要了解複製活動如何將來源結構描述和資料類型對應至接收,請參閱結構描述和資料類型對應。
| Azure SQL Database 資料類型 | Data Factory 過渡期資料類型 |
|---|---|
| Bigint | Int64 |
| 二進位 | Byte[] |
| bit | 布林值 |
| Char | 字串、字符[] |
| date | Datetime |
| Datetime | Datetime |
| datetime2 | Datetime |
| Datetimeoffset | DateTimeOffset |
| Decimal | Decimal |
| FILESTREAM 屬性(varbinary(max)) | Byte[] |
| Float | Double |
| 圖片 | Byte[] |
| int | Int32 |
| money | Decimal |
| NCHAR | 字串、字符[] |
| ntext | 字串、字符[] |
| NUMERIC | Decimal |
| NVARCHAR | 字串、字符[] |
| real | Single |
| rowversion | Byte[] |
| smalldatetime | Datetime |
| SMALLINT | Int16 |
| SMALLMONEY | Decimal |
| sql_variant | Object |
| 收發簡訊 | 字串、字符[] |
| time | TimeSpan |
| 時間戳記 | Byte[] |
| Tinyint | Byte |
| UNIQUEIDENTIFIER | Guid |
| varbinary | Byte[] |
| varchar | 字串、字符[] |
| Xml | String |
附註
對於對應至 Decimal 中繼類型的資料類型,目前複製活動支援的精確度最高為 28。 如果您有有效位數超過 28 的資料,則請考慮在 SQL 查詢中將其轉換成字串。
查閱活動屬性
若要了解屬性的詳細資料,請參閱查閱活動。
GetMetadata 活動屬性
若要了解關於屬性的詳細資料,請參閱 GetMetadata 活動
使用 Always Encrypted
當你將資料從Always Encrypted從Azure SQL Database複製時,請依照以下步驟操作:
將 Column 主金鑰(CMK) 存放在 Azure Key Vault。 進一步了解 如何藉由使用 Azure Key Vault 來設定 Always Encrypted
請務必取得資料行主要金鑰 (CMK) 儲存所在金鑰保存庫的存取權。 針對必要權限,請參閱這篇文章。
建立連結服務以連線到您的 SQL 資料庫,並使用受控身分識別或服務主體啟用 'Always Encrypted' 函式。
附註
Azure SQL Database Always Encrypted 支援以下情境:
- 來源或接收資料存放區都使用受控身分識別或服務主體作為金鑰提供者驗證類型。
- 來源和接收資料存放區都會使用受控身分識別作為金鑰提供者驗證類型。
- 來源和接收資料存放區都使用與金鑰提供者驗證類型相同的服務主體。
附註
目前,Azure SQL Database Always Encrypted 不支援用於映射資料流中的接收器轉化。
原生異動資料擷取
Azure Data Factory 可支援 SQL Server、Azure SQL DB 及 Azure SQL MI 的原生變更資料擷取功能。 ADF 對應資料流程可以自動偵測及擷取異動的資料,包括在 SQL 存放區中的資料列插入、更新和刪除。 若使用者沒有任何對應資料流程的程式碼經驗,可以將資料庫當作目的地存放區來附加,輕鬆地達成從 SQL 存放區複寫資料的情境。 此外,使用者也可以在兩者之間撰寫任何的資料轉換邏輯,以從 SQL 存放區達到累加式 ETL 的情境。
請確定管線和活動名稱保持不變,如此 ADF 便可以為您記錄檢查點,以便自動取得上次執行的變更資料。 如果您變更管線名稱或活動名稱,檢查點便會重設,這會導致您在下次執行時得從頭開始,或是取得從現在開始的變更。 如果您想要變更管線名稱或活動名稱,但仍想讓檢查點自動從上次的執行中取得變更的資料時,請在資料流程活動中使用您自己的檢查點索引鍵來達到此目的。
偵錯管線時,此功能的運作方式相同。 請注意,當您在偵錯執行期間重新整理瀏覽器時,將會重設檢查點。 在您對偵錯執行的管線結果感到滿意之後,您可以繼續發佈並觸發管線。 當您第一次觸發已發佈的管線時,會自動從頭重新開始,或是取得從現在開始的變更。
在監視區段中,您隨時有機會重新執行管線。 重新執行時,一律會從所選管線執行的前一個檢查點擷取變更的資料。
範例 1:
當您直接將「參照到啟用 SQL CDC 資料集的來源轉換」與「參照到對應資料流程中資料庫的接收轉換」鏈結起來時,SQL 來源上的變更會自動套用至目標資料庫,如此一來,您就可以輕鬆地達成在資料庫之間複寫資料的情境。 您可以在接收轉換中使用更新方法,以選取要在目標資料庫上允許插入、允許更新,還是要允許刪除。 對應資料流程中的範例指令碼如下所示。
source(output(
id as integer,
name as string
),
allowSchemaDrift: true,
validateSchema: false,
enableNativeCdc: true,
netChanges: true,
skipInitialLoad: false,
isolationLevel: 'READ_UNCOMMITTED',
format: 'table') ~> source1
source1 sink(allowSchemaDrift: true,
validateSchema: false,
deletable:true,
insertable:true,
updateable:true,
upsertable:true,
keys:['id'],
format: 'table',
skipDuplicateMapInputs: true,
skipDuplicateMapOutputs: true,
errorHandlingOption: 'stopOnFirstError') ~> sink1
範例 2:
如果您想要啟用 ETL 情境,而不是透過 SQL CDC 在資料庫之間進行資料複寫,可以在對應資料流程中使用運算式,包括 isInsert(1)、isUpdate(1),以及 isDelete(1) 來區分不同作業類型的資料列。 以下是用來對應資料流程的其中一個範例指令碼,若衍生出來的資料行值為 1 表示插入的資料列,2 表示更新的資料列,3 表示下游轉換已刪除的資料列,以處理差異資料。
source(output(
id as integer,
name as string
),
allowSchemaDrift: true,
validateSchema: false,
enableNativeCdc: true,
netChanges: true,
skipInitialLoad: false,
isolationLevel: 'READ_UNCOMMITTED',
format: 'table') ~> source1
source1 derive(operationType = iif(isInsert(1), 1, iif(isUpdate(1), 2, 3))) ~> derivedColumn1
derivedColumn1 sink(allowSchemaDrift: true,
validateSchema: false,
skipDuplicateMapInputs: true,
skipDuplicateMapOutputs: true) ~> sink1
已知的限制:
- 只有來自 SQL CDC 的淨變更會由 ADF 透過 cdc.fn_cdc_get_net_changes_ 來載入。
升級 Azure SQL Database 版本
要升級 Azure SQL Database 版本,請在編輯連結服務頁面,選擇Recommended 於Version下,並參考推薦版本的連結服務屬性設定連結服務。
建議的版本與舊版之間的差異
下表顯示了使用 Azure SQL Database 使用推薦版本與舊版時的差異。
| 建議的版本 | 舊版 |
|---|---|
透過 encrypt 為 strict 支援 TLS 1.3。 |
不支援 TLS 1.3。 |
相關內容
如需複製活動支援作為來源和接收器的資料存放區清單,請參閱支援的資料存放區和格式。