使用 Azure Data Factory 或 Synapse Analytics 在 Azure SQL Managed Instance 中複製並轉換數據

適用於: Azure Data Factory Azure Synapse Analytics

提示

Data Factory in Microsoft Fabric 是下一代的 Azure Data Factory,擁有更簡單的架構、內建 AI 及新功能。 如果你是資料整合新手,建議先從 Fabric Data Factory 開始。 現有的 ADF 工作負載可升級至 Fabric,以存取資料科學、即時分析與報告等新能力。

本文說明如何使用 Copy Activity 從 Azure SQL Managed Instance 複製資料,並使用 Data Flow 在 Azure SQL Managed Instance 中轉換資料。 欲了解更多,請閱讀 Azure Data FactorySynapse Analytics 的入門文章。

支援的功能

此 Azure SQL Managed Instance 連接器支援以下功能:

支援的功能 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 查詢或預存程序來擷取資料。 您也可以選擇從 SQL MI 來源平行複製,如需詳細資訊,請參閱從 SQL MI 平行複製一節。
  • 作為接收器,如果目的地資料表不存在,則會根據來源架構自動建立;在複製期間會將資料附加至資料表,或叫用具有自訂邏輯的預存程序。

必要條件

若要存取 SQL 受控執行個體公用端點,可以使用受控 Azure 整合執行階段。 確定您啟用了公用端點,而且允許網路安全性群組上的公用端點流量,讓服務可以連線到您的資料庫。 如需詳細資訊,請參閱此指導

要存取SQL Managed Instance私有端點,請設置一個 自架整合執行時來存取資料庫。 如果您將自我裝載整合執行階段佈建在受控執行個體所在的虛擬網路中,請確定您的整合執行階段機器位在與受控執行個體不同的子網路中。 如果您將自我裝載整合執行階段佈建在與受控執行個體不同的虛擬網路中,您可以使用虛擬網路對等互連或虛擬網路對虛擬網路的連線。 欲了解更多資訊,請參閱 將您的應用程式連接至 SQL 托管執行個體

開始

若要使用管線執行複製活動,您可以使用下列其中一個工具或 SDK:

使用 UI 建立連結服務到 Azure SQL 受控執行個體

請依照以下步驟在 Azure 入口網站介面中建立連結服務,連結到 SQL 管理實例。

  1. 請瀏覽 Azure Data Factory 或 Synapse 工作區的管理標籤,選擇連結服務,然後點選新建:

  2. 搜尋 SQL 並選擇 Azure SQL Server Managed Instance 連接器。

    Azure SQL Server 托管實例連接器的截圖。

  3. 設定服務詳細資料,測試連線,然後建立新的連結服務。

    SQL 受控執行個體連結服務設定的螢幕擷取畫面。

連接器設定詳細資料

以下章節將詳細說明用於定義 SQL Managed Instance 連接器特定 Azure Data Factory 實體的屬性。

連結服務屬性

Azure SQL Managed Instance連接器推薦版本支援 TLS 1.3。 請參閱本節,將您的 Azure SQL 受控執行個體連接器版本從舊版升級。 如需屬性詳細資料,請參閱對應的章節。

當您套用推薦時,Azure SQL 受控執行個體連結服務支援下列一般屬性:

屬性 描述 必要
型別 類型屬性必須設為 AzureSqlMI Yes
伺服器 您想要連線的 SQL Server 執行個體名稱或其網路位址。 Yes
資料庫 資料庫的名稱。 Yes
認證類型 用於驗證的類型。 允許的值為 SQL (預設值)、ServicePrincipalSystemAssignedManagedIdentityUserAssignedManagedIdentity。 移至特定屬性和必要條件的相關驗證一節。 Yes
始終加密設置 指定 alwaysencryptedsettings 資訊,讓 Always Encrypted 能夠使用受控身分識別或服務主體來保護儲存在 SQL Server 的敏感性資料。 如需詳細資訊,請參閱表格下方的 JSON 範例和使用 Always Encrypted 一節。 如果未指定,則會停用預設的一律加密設定。 No
加密 指出用戶端與伺服器之間傳送的所有資料是否都需要 TLS 加密。 選項:強制 (若為 true,預設值)/選擇性 (若為 false)/strict。 No
trustServerCertificate 指出通道是否會加密,同時略過驗證信任的憑證鏈結。 No
證書中的主機名 針對連線驗證伺服器憑證時要使用的主機名稱。 未指定時,伺服器名稱會用於憑證驗證。 No
connectVia 這個整合執行階段用於連接到資料存放區。 如果你的管理實例有公開端點並允許服務存取,你可以使用自架整合執行時或 Azure 整合執行時。 若未指定,則使用預設的 Azure 整合執行環境。 Yes

如需其他連線屬性,請參閱下表:

屬性 描述 必要
應用程序意圖 連線至伺服器時的應用程式工作負載類型。 允許值為:ReadOnlyReadWrite No
connectTimeout 等待連接到伺服器的時間長度(以秒為單位),在達到此時限後將終止嘗試並產生錯誤。 No
connectRetryCount 識別到閒置連線失敗之後,嘗試重新連線的次數。 此值應為介於 0 到 255 之間的整數。 No
connectRetryInterval 識別閒置連線失敗之後,每次重新連線嘗試之間的時間 (以秒為單位)。 此值應為介於 1 到 60 之間的整數。 No
loadBalanceTimeout 在連線終結之前,連線在連線集區中存在的最短時間 (以秒為單位)。 No
commandTimeout 終止嘗試執行命令並產生錯誤之前的預設等候時間 (以秒為單位)。 No
integratedSecurity 允許的值為 truefalse。 指定 false 時,指出是否已在連線中指定 userName 和 password。 在指定 true 時,表示是否使用目前的Windows帳號憑證進行驗證。 No
failoverPartner 當主要伺服器關閉時,應連線的合作夥伴伺服器名稱或位址。 No
最大池大小 特定連線的連線集區中允許的連線數目上限。 No
minPoolSize (最小池大小) 特定連線的連線集區中允許的連線數目下限。 No
多重主動結果集 (multipleActiveResultSets) 允許的值為 truefalse。 當您指定 true 時,應用程式可以維護多個使用中結果集 (MARS)。 當您指定 false 時,應用程式必須先處理或取消一個批次的所有結果集,才能在該連線上執行任何其他批次。 No
multiSubnetFailover 允許的值為 truefalse。 如果您的應用程式連線至不同子網路上的 AlwaysOn 可用性群組 (AG),則將此屬性設定為 true 可以更快地偵測並連線到目前使用中的伺服器。 No
封包大小 (packetSize) 用來與伺服器執行個體通訊的網路封包大小 (位元組)。 No
共用 允許的值為 truefalse。 當您指定 true 時,連線會是集區式連線。 當您指定 false 時,每次要求連線時都會明確開啟連線。 No

SQL 驗證

若要使用 SQL 驗證,除了上一節所述的泛型屬性外,請指定下列屬性:

屬性 描述 必要
userName 用來連線到伺服器的使用者名稱。 Yes
密碼 使用者名稱的密碼。 將此欄位標記為 SecureString 以將其安全地儲存。 或者,你可以引用儲存在 Azure Key Vault 中的秘密。 Yes

範例 1:使用 SQL 驗證

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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"
        }
    }
}

範例 2:在 Azure Key Vault

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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"
        }
    }
}

範例 3:使用 SQL 驗證搭配 Always Encrypted

{
    "name": "AzureSqlMILinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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 指定應用程式的用戶端識別碼。 Yes
servicePrincipalCredential 服務主體認證。 指定應用程式的金鑰。 將此欄位標記為 SecureString 以安全地儲存,或指向儲存在 Azure Key Vault 中的秘密。 Yes
用戶 指定您應用程式所屬的租用戶資訊,例如網域名稱或租用戶識別碼。 將滑鼠懸停在 Azure 傳送門的右上角即可取得。 Yes
azureCloudType 對於服務主體認證,請指定您的 Microsoft Entra 應用程式註冊到哪種 Azure 雲端環境類型。
允許的值為 AzurePublicAzureChinaAzureUsGovernmentAzureGermany。 預設會使用服務的雲端環境。
No

此外,請依照下列步驟操作:

  1. 請依照步驟為您的 Managed Instance 佈建 Microsoft Entra 管理員

  2. 從Azure入口建立Microsoft Entra應用程式。 請記下應用程式名稱,以及下列可定義連結服務的值:

    • 應用程式識別碼
    • 應用程式金鑰
    • 租戶識別碼
  3. 為服務主體建立登入。 在 SQL Server Management Studio(SSMS)中,使用一個 SQL Server 帳號連接你的受管理實例,該帳號為 sysadmin。 在 master 資料庫中執行下列 T-SQL:

    CREATE LOGIN [your application name] FROM EXTERNAL PROVIDER
    
  4. 針對服務主體,建立封閉式資料庫使用者。 連線到您想要從中複製資料的資料庫,然後執行下列 T-SQL:

    CREATE USER [your application name] FROM EXTERNAL PROVIDER
    
  5. 依照您平常為 SQL 使用者或其他人所進行的操作一樣,將所需的權限授與服務主體。 執行下列程式碼。 如需更多選項,請參閱此文件

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your application name]
    
  6. 設定一個 SQL Managed Instance 連結服務。

範例:使用 Service Principal 驗證

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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 服務進行驗證。 你可以用這個受管理身份來進行 SQL Managed Instance 認證。 指定的服務可以使用此身分識別從您資料庫存取資料,或從您的資料庫複製資料。

若要使用系統指派的受控識別驗證,請指定上一節所述的一般屬性,並依照下列步驟操作。

  1. 請依照步驟為您的 Managed Instance 佈建 Microsoft Entra 管理員

  2. 為系統指派的受管理的身份建立帳戶。 在 SQL Server Management Studio(SSMS)中,使用一個 SQL Server 帳號連接你的受管理實例,該帳號為 sysadmin。 在 master 資料庫中執行下列 T-SQL:

    CREATE LOGIN [your_factory_or_workspace_ name] FROM EXTERNAL PROVIDER
    
  3. 為系統分配的受控身分識別建立受控資料庫使用者。 連線到您想要從中複製資料的資料庫,然後執行下列 T-SQL:

    CREATE USER [your_factory_or_workspace_name] FROM EXTERNAL PROVIDER
    
  4. 請依照您對 SQL 使用者及其他身分的一般做法,授與系統指派受控識別所需權限。 執行下列程式碼。 如需更多選項,請參閱此文件

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your_factory_or_workspace_name]
    
  5. 設定一個 SQL Managed Instance 連結服務。

範例:使用系統指派的受控識別驗證

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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 工作區可以與一個使用者指派的受控身分識別關聯,代表該服務用於認證其他 Azure 服務。 你可以用這個受管理身份來進行 SQL Managed Instance 認證。 指定的服務可以使用此身分識別從您資料庫存取資料,或從您的資料庫複製資料。

若要使用使用者指派的受控識別驗證,除了上一節所述的一般屬性外,請指定下列屬性:

屬性 描述 必要
憑證 將使用者指派的受控身分識別指定為認證物件。 Yes

此外,請依照下列步驟操作:

  1. 請依照步驟為您的 Managed Instance 佈建 Microsoft Entra 管理員

  2. 為使用者指派的受控識別建立登入帳戶。 在 SQL Server Management Studio(SSMS)中,使用一個 SQL Server 帳號連接你的受管理實例,該帳號為 sysadmin。 在 master 資料庫中執行下列 T-SQL:

    CREATE LOGIN [your_factory_or_workspace_ name] FROM EXTERNAL PROVIDER
    
  3. 為使用者指派受控識別建立自主資料庫使用者。 連線到您想要從中複製資料的資料庫,然後執行下列 T-SQL:

    CREATE USER [your_factory_or_workspace_name] FROM EXTERNAL PROVIDER
    
  4. 依照您平常為 SQL 使用者和其他人所進行的操作一樣,建立一或多個使用者指派的受控識別,並將所需的權限授與使用者指派的受控識別。 執行下列程式碼。 如需更多選項,請參閱此文件

    ALTER ROLE [role name e.g. db_owner] ADD MEMBER [your_factory_or_workspace_name]
    
  5. 將一或多個使用者指派的受控識別指派給 Data Factory,並為每個使用者指派的受控識別建立認證

  6. 設定一個 SQL Managed Instance 連結服務。

範例:使用使用者指派的受控識別驗證

{
    "name": "AzureSqlDbLinkedService",
    "properties": {
        "type": "AzureSqlMI",
        "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 Managed Instance連結服務的:

屬性 描述 必要
型別 類型屬性必須設為 AzureSqlMI Yes
connectionString 此特性指定使用 SQL 認證連接 SQL Managed Instance 所需的 connectionString 資訊。 如需詳細資訊,請參閱下列範例。
預設的連接埠為 1433。 如果你使用 SQL Managed Instance 並設置公開端點,請明確指定埠號 3342。
你也可以在 Azure Key Vault 設定密碼。 如果是 SQL 認證,請從 connection string 中移除 password 設定。 欲了解更多資訊,請參閱在 Azure Key Vault 中存儲憑證
Yes
始終加密設置 指定 alwaysencryptedsettings 資訊,讓 Always Encrypted 能夠使用受控身分識別或服務主體來保護儲存在 SQL Server 的敏感性資料。 如需詳細資訊,請參閱使用 Always Encrypted 一節。 如果未指定,則會停用預設的一律加密設定。 No
connectVia 這個整合執行階段用於連接到資料存放區。 如果你的管理實例有公開端點並允許服務存取,你可以使用自架整合執行時或 Azure 整合執行時。 若未指定,則使用預設的 Azure 整合執行環境。 Yes

針對不同的驗證類型,請分別參閱下列各節特定的屬性和必要條件:

舊版的 SQL 驗證

若要使用 SQL 驗證,請指定上一節所述的泛型屬性。

舊版的服務主體驗證

若要使用服務主體驗證,除了上一節所述的一般屬性外,請指定下列屬性:

屬性 描述 必要
servicePrincipalId 指定應用程式的用戶端識別碼。 Yes
服務主體鍵 (servicePrincipalKey) 指定應用程式的金鑰。 將此欄位標記為 SecureString以安全儲存,或引用儲存在 Azure Key Vault 中的秘密。 Yes
用戶 指定您應用程式所屬的租用戶資訊,例如網域名稱或租用戶識別碼。 將滑鼠懸停在 Azure 傳送門的右上角即可取得。 Yes
azureCloudType 對於服務主體認證,請指定您的 Microsoft Entra 應用程式註冊到哪種 Azure 雲端環境類型。
允許的值為 AzurePublicAzureChinaAzureUsGovernmentAzureGermany。 預設會使用 Data Factory 或 Synapse 管線的雲端環境。
No

您也需要遵循服務主體驗證中的步驟,以授與相應權限。

系統指派受控身分識別驗證適用於舊版

如果要使用系統指派的受控識別驗證,請遵循系統指派的受控識別驗證中建議版本的相同步驟。

舊版的使用者指派受控識別驗證

如果要使用使用者指派的受控識別驗證,請遵循使用者指派的受控識別驗證中建議版本的相同步驟。

資料集屬性

如需可用來定義資料集的區段和屬性完整清單,請參閱資料集文章。 本節提供 SQL Managed Instance 資料集所支援的屬性清單。

若要將資料複製到 SQL 受控執行個體,以及從 SQL 受控執行個體複製資料,支援下列屬性:

屬性 描述 必要
型別 資料集的 type 屬性必須設定為 AzureSqlMITable Yes
結構描述 架構名稱。 來源:否,接收:是
表格 資料表/檢視的名稱。 來源:否,接收:是
資料表名稱 具有結構描述的資料表/檢視名稱。 此屬性支援是為了向後相容性。 對於新的工作負載,請使用 schematable 來源:否,接收:是

範例

{
    "name": "AzureSqlMIDataset",
    "properties":
    {
        "type": "AzureSqlMITable",
        "linkedServiceName": {
            "referenceName": "<SQL Managed Instance linked service name>",
            "type": "LinkedServiceReference"
        },
        "schema": [ < physical schema, optional, retrievable during authoring > ],
        "typeProperties": {
            "schema": "<schema_name>",
            "table": "<table_name>"
        }
    }
}

複製活動屬性

如需可用來定義活動的區段和屬性完整清單,請參閱管線一文。 本節提供 SQL Managed Instance 來源與匯入所支援的屬性清單。

SQL 受管理的執行個體作為數據來源

提示

若要使用資料分割有效率地從 SQL MI 載入資料,請深入了解從 SQL MI 平行複製

若要從 SQL Managed Instance 複製資料,複製活動來源區塊支援以下屬性:

屬性 描述 必要
型別 複製活動來源的 type屬性必須設定為 SqlMISource Yes
sqlReaderQuery 此屬性使用自訂 SQL 查詢來讀取資料。 例如 select * from MyTable No
sqlReaderStoredProcedureName(SQL 資料讀取存儲過程名稱) 此屬性是從來源資料表讀取資料的預存程序名稱。 最後一個 SQL 陳述式必須是預存程序中的 SELECT 陳述式。 No
儲存過程參數 這些是預存程序的參數。
允許的值為名稱或值組。 參數的名稱和大小寫必須符合預存程序參數的名稱和大小寫。
No
隔離級別 (isolationLevel) 指定 SQL 來源的交易鎖定行為。 允許的值為:ReadCommittedReadUncommittedRepeatableReadSerializableSnapshot。 如果未指定,則會使用資料庫的預設隔離等級。 如需詳細資訊,請參閱這篇文件 No
分割選項 指定用來從 SQL MI 載入資料的資料分割選項。
允許的值為:None (預設值)、PhysicalPartitionsOfTableDynamicRange
啟用分割選項後 (亦即不是 None),從 SQL MI 同時載入資料的平行程度,由複製活動的 parallelCopies 設定所控制。
No
分割設定 指定資料分割的設定群組。
當分割選項不是 None 時套用。
No
partitionSettings 底下:
partitionColumnName (分區列名稱) 整數類型或 date/datetime 類型 (intsmallintbigintdatesmalldatetimedatetimedatetime2datetimeoffset) 指定來源資料行的名稱,供平行複製的範圍分割使用。 如果未指定,則會自動偵測資料表的索引或主鍵,並用作分割分區欄位。
當分割選項是 DynamicRange 時套用。 如果您使用查詢來取出來源資料,請在 WHERE 子句中加上 ?DfDynamicRangePartitionCondition 。 如需範例,請參閱從 SQL 資料庫平行複製一節。
No
partitionUpperBound(分區上限) 用於分割分割範圍的分割欄位最大值。 這個值用於決定分割區的跨距,而不是用於篩選資料表中的資料列。 資料表或查詢結果中的所有資料列都會進行分割和複製。 如果未指定,複製活動會自動偵測該值。
當分割選項是 DynamicRange 時套用。 如需範例,請參閱從 SQL 資料庫平行複製一節。
No
partitionLowerBound 用於分割分割範圍的分割欄位最小值。 這個值用於決定分割區的跨距,而不是用於篩選資料表中的資料列。 資料表或查詢結果中的所有資料列都會進行分割和複製。 如果未指定,複製活動會自動偵測該值。
當分割選項是 DynamicRange 時套用。 如需範例,請參閱從 SQL 資料庫平行複製一節。
No

請注意下列幾點

  • 如果SqlMISource指定sqlReaderQuery,複製活動會對SQL Managed Instance來源執行此查詢以取得資料。 如果預存程序接受參數,您也可以藉由指定 sqlReaderStoredProcedureNamestoredProcedureParameters 來指定預存程序。
  • 在來源中使用預存程序來擷取資料時,請注意,如果您的預存程序設計為在傳入不同的參數值時傳回不同的結構描述,在從 UI 匯入結構描述,或使用自動資料表建立將資料複製到 SQL 資料庫時,您可能遇到失敗,或看到非預期的結果。

範例:使用 SQL 查詢

"activities":[
    {
        "name": "CopyFromAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<SQL Managed Instance input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SqlMISource",
                "sqlReaderQuery": "SELECT * FROM MyTable"
            },
            "sink": {
                "type": "<sink type>"
            }
        }
    }
]

範例:使用預存程序

"activities":[
    {
        "name": "CopyFromAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<SQL Managed Instance input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "SqlMISource",
                "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

SQL 受控執行個體作為接收

提示

請參考 將資料載入 SQL 托管執行個體的最佳實務,了解更多支援的寫入行為、配置及最佳實務。

若要將資料複製到 SQL Managed Instance,複製活動匯入區塊中支援以下屬性:

屬性 描述 必要
型別 複製活動接收端的 type 屬性必須設定為 SqlMISink Yes
preCopyScript 此屬性指定一個 SQL 查詢,讓複製活動在將資料寫入 SQL Managed Instance 之前執行。 每次複製執行只會調用此查詢一次。 您可以使用此屬性來清除預先載入的資料。 No
表格選項 指定是否根據來源結構描述,在接收資料表不存在時自動建立接收資料表。 當接收指定預存程序時,不支援自動建立資料表。 允許的值包為:none (預設) 或 autoCreate No
sqlWriterStoredProcedureName 定義如何將來源資料套用到目標資料表的預存程序名稱。
此預存程序將會依批次叫用。 針對只執行一次且與來源資料無關的作業 (例如刪除或截斷),請使用 preCopyScript 屬性。
請參閱叫用 SQL 接收器中的預存程序的範例。
No
儲存程序表類型參數名稱 預存程序中指定資料表類型的參數名稱。 No
sqlWriterTableType 在預存程序中使用的資料表類型名稱。 複製活動會透過此資料表類型,讓移動中的資料可供暫存資料表使用。 然後,預存程序程式碼可以合併正在複製的資料與現有的資料。 No
儲存過程參數 預存程序的參數。
允許的值為:名稱和值組。 參數的名稱和大小寫必須符合預存程序參數的名稱和大小寫。
No
writeBatchSize 每個批次插入 SQL 資料表的資料列數。
允許的值為資料列數目的整數。 根據預設,服務會依據資料列大小動態決定適當的批次大小。
No
writeBatchTimeout 插入、upsert 及預存程序作業完成前的等候時間,超過此時間即會逾時。
允許的值為時間範圍。 例如 “00:30:00” 為 30 分鐘。 如果未指定任何值,逾時預設為 "00:30:00"。
No
 最大並發連線數 在活動執行期間建立至資料存放區的併發連線上限。 僅在想要限制並行連線時,才需要指定值。  否
WriteBehavior 指定複製活動的寫入行為,以載入資料到 Azure SQL MI。
允許的值為 InsertUpsert。 根據預設,服務會使用 Insert 載入資料。
No
upsertSettings 指定寫入行為的設定群組。
當 WriteBehavior 選項為 Upsert 時套用。
No
upsertSettings 底下:
useTempDB 指定是否要使用全域暫存資料表或實體資料表作為 upsert 的過渡資料表。
根據預設,服務會使用全域暫存表作為中介資料表。 值為 true
No
interimSchemaName 如果使用實體資料表,請指定建立過渡資料表的過渡結構描述。 注意:使用者必須具有建立和刪除資料表的權限。 根據預設,過渡資料表會與接收資料表共用相同的結構描述。
套用當 useTempDB 選項為 False 時。
No
金鑰 指定用於唯一識別資料列的欄位名稱。 您可以使用單一按鍵或一組按鍵。 如果未指定,則會使用主索引鍵。 No

範例 1:附加資料

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "tableOption": "autoCreate",
                "writeBatchSize": 100000
            }
        }
    }
]

範例 2:在複製期間叫用預存程序

若要了解更多詳細資料,請參閱叫用 SQL MI 接收器中的預存程序

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "sqlWriterStoredProcedureName": "CopyTestStoredProcedureWithParameters",
                "storedProcedureTableTypeParameterName": "MyTable",
                "sqlWriterTableType": "MyTableType",
                "storedProcedureParameters": {
                    "identifier": { "value": "1", "type": "Int" },
                    "stringData": { "value": "str1" }
                }
            }
        }
    }
]

範例 3:更新或插入 (Upsert) 資料

"activities":[
    {
        "name": "CopyToAzureSqlMI",
        "type": "Copy",
        "inputs": [
            {
                "referenceName": "<input dataset name>",
                "type": "DatasetReference"
            }
        ],
        "outputs": [
            {
                "referenceName": "<SQL Managed Instance output dataset name>",
                "type": "DatasetReference"
            }
        ],
        "typeProperties": {
            "source": {
                "type": "<source type>"
            },
            "sink": {
                "type": "SqlMISink",
                "tableOption": "autoCreate",
                "writeBehavior": "upsert",
                "upsertSettings": {
                    "useTempDB": true,
                    "keys": [
                        "<column name>"
                    ]
                },            
            }
        }
    }
]

從 SQL MI 平行複製

Azure SQL Managed Instance 連接器在複製活動中提供內建的資料分割功能,以平行複製資料。 您可以在複製活動的 [來源] 索引標籤上找到資料分割選項。

分割選項的螢幕擷取畫面

當您啟用分割複本時,複製活動會平行查詢 SQL MI 來源,以依分割區來載入資料。 平行程度由複製活動的 parallelCopies 設定所控制。 例如,如果您將 parallelCopies 設定為 4,服務會根據您指定的資料分割選項和設定,同時產生並執行四個查詢,而每個查詢會從 SQL MI 取取出一部分資料。

建議您啟用平行複製與資料分割,特別是從 SQL MI 載入大量資料時。 以下針對各種情節的建議設定。 將資料複製到以檔案為基礎的資料存放區時,建議分成多個檔案來寫入資料夾 (僅指定資料夾名稱),這樣效能會比寫入單一檔案更好。

情境 建議的設定
從大型資料表進行完整載入,並使用實體分割。 分割選項:資料表的實體分割區。

在執行期間,服務會自動偵測實體分割區,並依分割區複製資料。

若要檢查您的資料表是否有實體分割區,您可以參考此查詢
從大型資料表進行完整載入,不使用實體分區,但需使用整數或日期時間欄位進行資料分區。 分割選項:動態範圍分割。
分割資料行 (選用):指定用來分割資料的資料行。 若未指定,會使用索引或主索引鍵資料行。
分割區上限分割區下限 (選用):指定是否要決定分割區跨距。 這不適用於篩選資料表中的資料列,資料表中的所有資料列都會分割並複製。 如果未指定,複製活動會自動偵測值。

例如,如果您的分割區資料行「識別碼」具有範圍 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 ?DfDynamicRangePartitionCondition
2. 執行來自資料表的查詢,包含欄位選擇及附加的 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

使用分割區選項載入資料的最佳做法:

  1. 選擇獨特的欄位作為分割欄位(例如主鍵或唯一鍵)以避免資料不均。
  2. 如果資料表有內建分割區,請使用分割選項「資料表的實體分割區」,以獲得更佳的效能。
  3. 如果你用 Azure Integration Runtime 複製資料,可以設定較大的「Data Integration Units (DIU)」(>4)來利用更多運算資源。 檢查該處適用的案例。
  4. 複製平行處理原則的程度」會控制分割區數目,將此數目設定過大有時會損害效能,建議將此數目設定為 (DIU 或自我裝載 IR 節點數目) * (2 到 4)。

範例:從實體分割區的大型資料表進行完整載入

"source": {
    "type": "SqlMISource",
    "partitionOption": "PhysicalPartitionsOfTable"
}

範例:使用動態範圍分割進行查詢

"source": {
    "type": "SqlMISource",
    "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”,如下所示。

SQL 查詢結果

將資料載入 SQL Managed Instance 的最佳實務

當你將資料複製到 SQL Managed Instance 時,可能需要不同的寫入行為:

  • 附加:我的來源資料只有新記錄。
  • Upsert:我的來源資料同時有插入和更新。
  • 覆寫:我想要每次都重新載入整個維度資料表。
  • 使用自訂邏輯寫入:在最終插入目的地資料表之前,我還需要額外的處理。

如需設定方式和最佳做法,請參閱個別章節。

附加資料

附加資料是 SQL Managed Instance sink 連接器的預設行為。 此服務會執行大量插入,以有效率地寫入您的資料表。 您可以在複製活動中據此設定來源與接收。

Upsert 資料

複製活動現在原生支援先將資料載入資料庫暫存資料表,然後在索引鍵存在時更新接收資料表中的資料,否則插入新資料。 若要深入了解複製活動中的 upsert 設定,請參閱 SQL 受控執行個體作為接收

覆寫整個資料表

您可以在複製活動接收中設定 preCopyScript 屬性。 在此情況下,針對執行的每個複製活動,服務會先執行指令碼。 然後執行複製以插入資料。 例如,若要以最新的資料覆寫整個資料表,可以指定先刪除所有記錄,再從來源大量載入新資料的指令碼。

使用自訂邏輯寫入資料

使用自訂邏輯寫入資料的步驟類似於更新插入資料一節中所述的步驟。 當您需要在最終插入來源資料至目的地資料表之前套用額外的處理時,您可以載入暫存表格,然後叫用預存程序活動,或在複製活動接收器中叫用預存程序來套用資料。

從 SQL 接收調用預存程序

當你將資料複製到 SQL Managed Instance 時,也可以設定並呼叫使用者指定的儲存程序,並在每個原始資料表批次上加入額外參數。 預存程序功能使用資料表值參數

當內建的複製機制無法滿足需求時,您可以使用預存程序。 例如,當您想要在最終插入來源資料至目的地資料表之前,套用額外的處理。 額外處理的一些範例包括:合併資料行、查閱其他的值,以及插入多個資料表中。

下列範例說明如何使用預存程序,將資料 upsert 到 SQL Server 資料庫中的資料表。 假設輸入資料和接收器 Marketing 資料表各有三個資料行:ProfileIDStateCategory。 根據 ProfileID 資料行執行 upsert,且僅套用於名為 ProductA 的特定類別。

  1. 在資料庫中,使用與 sqlWriterTableType 相同的名稱來定義資料表類型。 資料表類型的結構描述會與輸入資料所傳回的結構描述相同。

    CREATE TYPE [dbo].[MarketingType] AS TABLE(
        [ProfileID] [varchar](256) NOT NULL,
        [State] [varchar](256) NOT NULL,
        [Category] [varchar](256) NOT NULL
    )
    
  2. 在資料庫中,使用與 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
    
  3. 在您的管線中,請依下列方式定義複製活動中的 SQL MI 接收端區段:

    "sink": {
        "type": "SqlMISink",
        "sqlWriterStoredProcedureName": "spOverwriteMarketing",
        "storedProcedureTableTypeParameterName": "Marketing",
        "sqlWriterTableType": "MarketingType",
        "storedProcedureParameters": {
            "category": {
                "value": "ProductA"
            }
        }
    }
    

映射資料流屬性

在映射資料流中轉換資料時,你可以從 Azure SQL Managed Instance 讀寫資料表。 如需詳細資訊,請參閱對應資料流程中的來源轉換接收轉換

來源轉換

下表列出 Azure SQL Managed Instance 來源所支援的屬性。 您可以在 [來源選項] 索引標籤中編輯這些屬性。

名稱 描述 必要 允許的值 資料流程指令碼屬性
資料表 如果您選取 [資料表] 作為輸入,資料流程會從資料集中指定的資料表擷取所有資料。 No - -
查詢 如果您選取 [查詢] 作為輸入,請指定要從來源擷取資料的 SQL 查詢,這會覆寫您在資料集中指定的任何資料表。 使用查詢是減少測試或查找資料列的絕佳方式。

不支援 Order By 子句,但您可以設定完整的 SELECT FROM 陳述式。 您也可使用使用者定義的資料表函數。 select * from udfGetData() 是 SQL 中的 UDF,您可以在資料流程中用於傳回資料表。
查詢範例:Select * from MyTable where customerId > 1000 and customerId < 2000
No 字符串 查詢
批次大小 指定批次大小,以將大量資料分成多次讀取。 No 整數 批次大小
隔離等級 選擇下列其中一個隔離等級:
- 讀取認可
- Read Uncommitted (預設)
- 可重複讀取
- 可序列化
- 無 (忽略隔離等級)
No READ_COMMITTED
READ_UNCOMMITTED
REPEATABLE_READ
可序列化
NONE
隔離級別 (isolationLevel)
啟用累加式擷取 使用此選項可告訴 ADF 只處理自上次執行管線後已變更的資料列。 No - -
增量資料行 使用累加式擷取功能時,您必須選擇想要在來源資料表中用做浮水印的日期/時間或數值資料行。 No - -
啟用原生異動資料擷取 (預覽) 使用此選項可告知 ADF,只處理自管線上次執行以來,由 SQL 變更資料擷取技術擷取的增量資料。 使用此選項時,增量資料包含資料列插入、更新與刪除,系統都會自動載入,而不需要任何增量資料行。 你需要先在 >,才能在 ADF 中使用這個選項。 如需 ADF 中此選項的詳細資訊,請參閱原生異動資料擷取 No - -
從頭開始讀取 使用累加擷取設定此選項時,會指示 ADF 在第一次執行管線時讀取所有資料列,並開啟累加擷取。 No - -

提示

對應資料流程查詢模式不支援 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。

Azure SQL 受控執行個體範例腳本示範

當你使用 Azure SQL Managed Instance 作為來源類型時,相關的資料流腳本是:

source(allowSchemaDrift: true,
    validateSchema: false,
    isolationLevel: 'READ_UNCOMMITTED',
    query: 'select * from MYTABLE',
    format: 'query') ~> SQLMISource

接收轉換

下表列出 Azure SQL Managed Instance sink 所支援的屬性。 您可以在 接收器選項 索引標籤中編輯這些屬性。

名稱 描述 必要 允許的值 資料流程指令碼屬性
更新方法 指定您的資料庫目的地所允許的作業。 預設僅允許插入。
若要更新、插入或刪除資料列,必須使用 [變更資料列轉換] 來標記要進行這些操作的資料列。
Yes truefalse 可刪除的
可插入的
可更新的
upsertable
主鍵欄 若要執行更新、upsert 與刪除,必須設定索引鍵資料行,以判斷要變更哪一列。
您選取作為索引鍵的資料行名稱,將用於後續的更新、upsert、刪除。 因此,您必須選擇接收對應中存在的資料行。
No 陣列 金鑰
略過寫入索引鍵資料行 如果您不想將值寫入索引鍵資料行,請選取 [跳過寫入索引鍵資料行]。 No truefalse skipKeyWrites
資料表動作 決定在寫入之前,是否要重新建立或移除目的地資料表中的所有資料列。
- :不會對資料表執行任何動作。
- 重新建立:將會刪除並重新建立資料表。 如果要動態建立新的資料表,則為必要。
- 截斷:將會移除目標資料表中的所有資料列。
No truefalse 重新創建
截斷
批次大小 指定要在每個批次中寫入的資料列數目。 較大的批次大小可改善壓縮與記憶體最佳化,但也會增加快取資料時發生記憶體不足例外狀況的風險。 No 整數 批次大小
前置和後置 SQL 指令碼 指定在資料寫入接收資料庫之前 (前置處理) 與之後 (後置處理) 執行的多行 SQL 指令碼。 No 字符串 preSQLs
postSQLs

提示

  1. 建議將含有多個命令的單一批次指令碼分成多個批次。
  2. 只有傳回簡單更新計數的資料定義語言 (DDL) 和資料操作語言 (DML) 陳述式可以當作批次的一部份來執行。 若要深入了解,請參閱執行批次作業

Azure SQL Managed Instance sink script 範例

當你使用 Azure SQL Managed Instance 作為匯入類型時,相關的資料流程腳本是:

IncomingStream sink(allowSchemaDrift: true,
    validateSchema: false,
    deletable:false,
    insertable:true,
    updateable:true,
    upsertable:true,
    keys:['keyColumn'],
    format: 'table',
    skipDuplicateMapInputs: true,
    skipDuplicateMapOutputs: true) ~> SQLMISink

查閱活動屬性

若要了解屬性的詳細資料,請參閱查詢活動

GetMetadata 活動屬性

若要了解關於屬性的詳細資料,請參閱 GetMetadata 活動

SQL Managed Instance 的資料型別映射

當資料透過複製活動從 SQL Managed Instance 複製至服務,或從服務複製至 SQL Managed Instance 時,會使用以下映射,將 SQL Managed Instance 資料類型轉換為服務內部使用的臨時資料型態。 若要了解複製活動如何將來源結構描述和資料類型對應至接收端,請參閱結構描述和資料類型對應

SQL Managed Instance 資料型別 過渡期服務資料類型
Bigint Int64
二進位 Byte[]
位元 布林值
Char 字串、字符[]
日期 日期時間
日期與時間 日期時間
datetime2 日期時間
Datetimeoffset DateTimeOffset
Decimal Decimal
FILESTREAM 屬性(varbinary(max)) Byte[]
浮點數 Double
圖片 Byte[]
int(整數) Int32
Decimal
NCHAR 字串、字符[]
ntext 字串、字符[]
數值型 Decimal
Nvarchar 字串、字符[]
real Single
rowversion Byte[]
smalldatetime 日期時間
SMALLINT Int16
smallmoney Decimal
sql_variant 物件
收發簡訊 字串、字符[]
時間 TimeSpan
時間戳記 Byte[]
Tinyint Int16
唯一識別碼 Guid
varbinary Byte[]
varchar 字串、字符[]
xml 字符串

注意

對於對應至 Decimal 中繼類型的資料類型,目前複製活動支援的精確度最高為 28。 如果您的資料需要精度大於 28,請考慮在 SQL 查詢中轉換成字串。

使用 Always Encrypted

當您在使用Always Encrypted從/向 SQL Managed Instance 複製資料時,請依照以下步驟操作:

  1. Column 主金鑰(CMK) 存放在 Azure Key Vault。 進一步了解 如何藉由使用 Azure Key Vault 來設定 Always Encrypted

  2. 請確保已授與存取金鑰保存庫的權限,因為資料行主金鑰 (CMK) 會儲存在該處。 如需取得權限,請參閱這篇文章

  3. 建立連結服務以連線到您的 SQL 資料庫,並使用受控身分識別或服務主體啟用 'Always Encrypted' 函式。

注意

SQL Managed Instance Always Encrypted 支援以下情境:

  1. 來源或接收器資料存放區都使用受控識別或服務主體作為金鑰提供者驗證類型。
  2. 來源和接收資料存放區都會使用受控身分識別作為金鑰提供者驗證類型。
  3. 來源和接收資料存放區都使用與金鑰提供者驗證類型相同的服務主體。

注意

目前,SQL Managed Instance 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

已知的限制:

升級 Azure SQL Managed Instance 版本

要升級 Azure SQL Managed Instance 版本,請在編輯連結服務頁面中,選擇Version中的Recommended,並參考推薦版本的連結服務屬性來設定連結服務。

下表顯示使用推薦版本與舊版 Azure SQL Managed Instance 之間的差異。

建議的版本 舊版
使用 encrypt 以作為 strict 支援 TLS 1.3。 不支援 TLS 1.3。

如需複製活動支援作為來源和接收器的資料存放區清單,請參閱支援的資料存放區