<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>Azure Data Factory Blog articles</title>
    <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/bg-p/AzureDataFactoryBlog</link>
    <description>Azure Data Factory Blog articles</description>
    <pubDate>Sat, 14 Mar 2026 17:44:36 GMT</pubDate>
    <dc:creator>AzureDataFactoryBlog</dc:creator>
    <dc:date>2026-03-14T17:44:36Z</dc:date>
    <item>
      <title>Continued region expansion: Azure Data Factory is generally available in Mexico Central</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/4420747</link>
      <description>&lt;P&gt;&lt;A href="https://azure.microsoft.com/en-us/services/data-factory/" data-bi-an="body" data-bi-tn="undefined" target="_blank"&gt;Azure Data Factory&lt;/A&gt;&amp;nbsp;is now available &lt;STRONG&gt;Mexico Central&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;You can now provision Data Factory in the new region in order to co-locate your Extract-Transform-Load logic with your data lake and compute.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;See the full set of&amp;nbsp;&lt;A href="https://azure.microsoft.com/en-us/global-infrastructure/services/?cdn=disable&amp;amp;products=data-factory" data-bi-an="body" data-bi-tn="undefined" target="_blank"&gt;Azure Data Factory supported regions&lt;/A&gt;.&lt;/P&gt;</description>
      <pubDate>Thu, 05 Jun 2025 01:43:07 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/4420747</guid>
      <dc:creator>Chunhua</dc:creator>
      <dc:date>2025-06-05T01:43:07Z</dc:date>
    </item>
    <item>
      <title>Announcing the new Databricks Job activity in ADF!</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/announcing-the-new-databricks-job-activity-in-adf/ba-p/4410939</link>
      <description>&lt;P&gt;We’re excited to announce that Azure Data Factory now supports the orchestration of Databricks Jobs!&lt;/P&gt;
&lt;P&gt;&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/databricks/jobs/" target="_blank" rel="noopener"&gt;Databrick Jobs&lt;/A&gt; allow you to schedule and orchestrate a task or multiple tasks in a workflow in your Databricks workspace. Since any operation in Databricks can be a task, this means you can now run anything in Databricks via ADF, such as serverless jobs, SQL tasks, Delta Live Tables, batch inferencing with model serving endpoints, or&lt;A class="lia-external-url" href="https://learn.microsoft.com/en-us/azure/databricks/jobs/powerbi" target="_blank"&gt; automatically publishing and refreshing semantic models&lt;/A&gt; in the Power BI service.&lt;/P&gt;
&lt;P&gt;And with this new update, you’ll be able to trigger these workflows from your Azure Data Factory pipelines.&lt;/P&gt;
&lt;DIV class="styles_lia-table-wrapper__h6Xo9 styles_table-responsive__MW0lN"&gt;&lt;table class="lia-border-style-hidden" border="1" style="width: 100%; border-width: 1px;"&gt;&lt;colgroup&gt;&lt;col style="width: 50.0491%" /&gt;&lt;col style="width: 49.9019%" /&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="lia-border-style-none"&gt;&lt;img /&gt;&lt;/td&gt;&lt;td class="lia-border-style-none"&gt;
&lt;P&gt;To make use of this new activity, you’ll find a new Databricks activity under the &lt;STRONG&gt;Databricks &lt;/STRONG&gt;activity group called &lt;STRONG&gt;Job&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P&gt;Once you’ve added the &lt;STRONG&gt;Job activity (Preview) &lt;/STRONG&gt;to your pipeline canvas, you can connect to your Databricks workspace and configure the settings to select your Databricks job, allowing you to run the Job from your pipeline.&lt;/P&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/DIV&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We also know that allowing parameterization in your pipelines is important as it allows you to create generic reusable pipeline models.&lt;/P&gt;
&lt;P&gt;ADF continues to provide support for these patterns and is excited to extend this capability to the new Databricks Job activity.&lt;/P&gt;
&lt;P&gt;Under the settings of your Job activity, you’ll also be able to configure and set parameters to send to your Databricks job, allowing maximum flexibility and power for your orchestration jobs.&lt;/P&gt;
&lt;img /&gt;
&lt;P&gt;To learn more, read &lt;A href="https://learn.microsoft.com/en-us/fabric/data-factory/azure-databricks-activity" target="_blank"&gt;Azure Databricks activity - Microsoft Fabric | Microsoft Learn&lt;/A&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Have any questions or feedback? Leave a comment below!&lt;/STRONG&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 14 May 2025 15:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/announcing-the-new-databricks-job-activity-in-adf/ba-p/4410939</guid>
      <dc:creator>Noelle_Li</dc:creator>
      <dc:date>2025-05-14T15:00:00Z</dc:date>
    </item>
    <item>
      <title>Integrate Microsoft Fabric with SAP data with USB4SAP [in live and cached mode]</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/integrate-microsoft-fabric-with-sap-data-with-usb4sap-in-live/ba-p/4152300</link>
      <description>&lt;H2&gt;Microsoft Fabric integration with SAP using USB4SAP&lt;/H2&gt;&lt;P&gt;With USB4SAP, Fabric users can access SAP data. This data can be used to refresh PowerBI semantic models in live and cache mode. USB4SAP provides deep integration into your SAP system (for raw tables data, as well as modeled information like reports, queries, CDS, BW extractors etc), SAP tables data extraction with delta / CDC capabilities (ADF connector) without the need for SLT or Change Pointers activation.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Specifically for integration with customers SAP systems, you can leverage USB4SAP connector for:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;PowerBI live and cached mode&lt;/LI&gt;&lt;LI&gt;Onelake based integration&lt;/LI&gt;&lt;LI&gt;REST based synchronous API integration&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;It supports no-code, native SAP security based access to the following SAP objects (HANA or non-HANA based):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Tables (with Change data capture)&lt;/LI&gt;&lt;LI&gt;Views&lt;/LI&gt;&lt;LI&gt;CDS&lt;/LI&gt;&lt;LI&gt;Reports&lt;/LI&gt;&lt;LI&gt;TCodes&lt;/LI&gt;&lt;LI&gt;BW Extractors&lt;/LI&gt;&lt;LI&gt;ABAP queries&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;Following modes of Change Data Capture are supported:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Tables &amp;amp; views:&lt;OL&gt;&lt;LI&gt;Time-series based [ie, date &amp;amp; time of the record create, update, delete]&lt;/LI&gt;&lt;LI&gt;Document &amp;amp; item number series based&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;LI&gt;Reports / Queries / TCodes:&lt;OL&gt;&lt;LI&gt;Time-series based using variants on selection screen.&amp;nbsp;&lt;/LI&gt;&lt;/OL&gt;&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;Conceptual architecture&lt;/H2&gt;&lt;P&gt;Following are the key components for the conceptual architecture for MS Fabric integration with SAP systems.&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Customers SAP systems (ERP, S4HANA, BW, CRM, SRM, APO, Solman etc) are organizational systems of record&lt;/LI&gt;&lt;LI&gt;Data transmission is REST over HTTPS (unless specified otherwise, where RFC / OData may also be used)&lt;/LI&gt;&lt;LI&gt;Data &amp;amp; information storage in any cloud (eg, Microsoft Azure) or on-premise repository&lt;/LI&gt;&lt;LI&gt;Information security is using SAS key over HTTPS&lt;/LI&gt;&lt;LI&gt;Synthesis layer is combination of tools like PowerAutomate / Logic Apps etc.&lt;/LI&gt;&lt;LI&gt;PowerBI/ PowerPlatform / MS Excel and other apps are supported using REST / PowerQuery&lt;/LI&gt;&lt;LI&gt;CX-Portal layer [optional] in&amp;nbsp; MS SharePoint or other customer Portal solutions&lt;/LI&gt;&lt;/UL&gt;&lt;H2&gt;Application architecture&lt;/H2&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Following are the application architectures for live&amp;nbsp; and cache connection from Fabric PowerBI to backend SAP systems. Data Factory templates are also available to accelerate use of Ecoservity's connectors and integration patterns within a pipeline.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;PowerQuey&amp;nbsp; Connector Method:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Fabric live connection to SAP: &amp;nbsp;Live query to SAP leverages following mechanism&lt;/LI&gt;&lt;/UL&gt;&lt;UL&gt;&lt;LI&gt;PowerQuery module within PowerBI&lt;/LI&gt;&lt;LI&gt;REST API [over HTTPS] connectivity to SAP [based on SICF or Gateway] for Power Platform apps&lt;/LI&gt;&lt;LI&gt;Video guide is available here: &amp;nbsp;&lt;A href="https://youtu.be/vmJVoNSBdpM" target="_blank" rel="noopener"&gt;https://youtu.be/vmJVoNSBdpM&lt;/A&gt;.&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;Following is the link for Azure marketplace listing for this solution (free trial available):&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;A href="https://azuremarketplace.microsoft.com/en-us/marketplace/apps/ecoservity.peopleatwork4pbi?tab=Overview" target="_blank" rel="noopener"&gt;https://azuremarketplace.microsoft.com/en-us/marketplace/apps/ecoservity.peopleatwork4pbi?tab=Overview&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Cached Method:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Microsoft Fabric cached connection to SAP: Cached query to SAP leverages following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;PowerQuery module within Fabric PowerBI&lt;/LI&gt;&lt;LI&gt;REST API [over HTTPS] connectivity to SAP [based on SICF or Gateway] , with SAS-key [over HTTPS] based security&lt;/LI&gt;&lt;LI&gt;Onelake data creation with support for CSV, JSON and Parquet&lt;/LI&gt;&lt;LI&gt;Video guide is available here: &lt;A href="https://www.youtube.com/playlist?list=PLTum8dvrbVA05nV3hsr8rMPjqGHc2oOAq" target="_blank" rel="noopener"&gt;https://www.youtube.com/playlist?list=PLTum8dvrbVA05nV3hsr8rMPjqGHc2oOAq&lt;/A&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/LI&gt;&lt;LI&gt;Following is the link for Azure marketplace listing for this solution (free trial available):&lt;/LI&gt;&lt;/UL&gt;&lt;P&gt;&lt;A href="https://azuremarketplace.microsoft.com/en-us/marketplace/apps/ecoservity.usb4sap_azure_data_factory?tab=Overview" target="_blank" rel="noopener"&gt;https://azuremarketplace.microsoft.com/en-us/marketplace/apps/ecoservity.usb4sap_azure_data_factory?tab=Overview&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;REST Method:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;REST API based connection to SAP: Cached query to SAP leverages following:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;UL&gt;&lt;LI&gt;PowerQuery module within Fabric PowerBI&lt;/LI&gt;&lt;LI&gt;REST API [over HTTPS] connectivity to SAP [based on SICF or Gateway] , with SAS-key [over HTTPS] based security&lt;/LI&gt;&lt;LI&gt;Onelake data creation with support for CSV and Parquet&lt;/LI&gt;&lt;/UL&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;DIV class=""&gt;&amp;nbsp;&lt;/DIV&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Data Factory Template Method:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In collaboration with Microsoft, Ecoservity has developed a set of Data Factory templates that make it faster and easier to integrate SAP into the Fabric ecosystem. These templates use Data Factories REST data source and data sink to read and write data from SAP.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;TABLE width="956"&gt;&lt;TBODY&gt;&lt;TR&gt;&lt;TD width="455"&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;TD width="501"&gt;&lt;img /&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The following screenshots show a Data Factory template that copies data from an SAP semantic model via REST.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;BR /&gt;Then, the data syncs to Fabric Onelake:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;img /&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;STRONG&gt;Conclusion:&lt;/STRONG&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;In this blog, we reviewed alternate methods of using Ecoservity's USB4SAP product in conjunction with Data Factory to load SAP business data for PowerBI reports and data lake. You can adopt live and cache modes.&amp;nbsp; Templates make it easy for end users to adopt the solution in a pipeline. Ecoservity product is available in Azure Market Place. You can go ahead and try it out as alternative to existing connectors available in data factory.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 19 Jun 2024 17:36:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/integrate-microsoft-fabric-with-sap-data-with-usb4sap-in-live/ba-p/4152300</guid>
      <dc:creator>Sunil_Sabat</dc:creator>
      <dc:date>2024-06-19T17:36:30Z</dc:date>
    </item>
    <item>
      <title>Optimizing ETL Workflows: A Guide to Azure Integration and Authentication with Batch and Storage</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/optimizing-etl-workflows-a-guide-to-azure-integration-and/ba-p/4138729</link>
      <description>&lt;H2&gt;&lt;FONT size="5"&gt;Introduction&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;FONT size="3"&gt;When it comes to building a robust foundation for ETL (Extract, Transform, Load) pipelines, the trio of Azure Data Factory or Azure Synapse Analytics, Azure Batch, and Azure Storage is indispensable. These tools enable efficient data movement, transformation, and processing across diverse data sources, thereby helping us achieve our strategic goals.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;This document provides a comprehensive guide on how to authenticate Azure Batch with SAMI and Azure Storage with Synapse SAMI. This enables user-driven connectivity to storage, facilitating data extraction. Furthermore, it allows the use of custom activities, such as High-Performance Computing (HPC), to process the extracted data.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;The key enabler of these functionalities is the Synapse Pipeline. Serving as the primary orchestrator, the Synapse Pipeline is adept at integrating various Azure resources in a secure manner. Its capabilities can be extended to Azure Data Factory (ADF), providing a broader scope of data management and transformation.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;Through this guide, you will gain insights into leveraging these powerful Azure services to optimize your data processing workflows.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;FONT size="5"&gt;Services Overview&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;FONT size="3"&gt;During this procedure we will use different services, below you have more details about each of them.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;Azure Synapse Analytics / Data Factory&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Azure Synapse Analytics&amp;nbsp;is an enterprise analytics service that accelerates time to insight across data warehouses and big data systems. Azure Synapse brings together the best of SQL technologies used in enterprise data warehousing, Spark technologies used for big data, Data Explorer for log and time series analytics, Pipelines for data integration and ETL/ELT, and deep integration with other Azure services such as Power BI, CosmosDB, and AzureML.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation:&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/synapse-analytics/overview-what-is" target="_blank" rel="noopener"&gt;What is Azure Synapse Analytics? - Azure Synapse Analytics | Microsoft Learn&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/introduction" target="_blank" rel="noopener"&gt;&lt;FONT size="3"&gt;Introduction to Azure Data Factory - Azure Data Factory | Microsoft Learn&lt;/FONT&gt;&lt;/A&gt;&lt;BR /&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H4&gt;Azure Batch&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Azure Batch&amp;nbsp;is a powerful platform service designed for running large-scale parallel and high-performance computing (HPC) applications in the cloud.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;/FONT&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/batch/batch-technical-overview" target="_blank" rel="noopener"&gt;&lt;FONT size="3"&gt;Azure Batch runs large parallel jobs in the cloud - Azure Batch | Microsoft Learn&lt;/FONT&gt;&lt;/A&gt;&lt;BR /&gt;&amp;nbsp;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;&lt;FONT size="4"&gt;Azure Storage&lt;/FONT&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Azure Storage&amp;nbsp;provides scalable and secure storage services for various data types, including services like&amp;nbsp;&lt;STRONG&gt;Azure Blob storage&lt;/STRONG&gt;,&amp;nbsp;&lt;STRONG&gt;Azure Table storage&lt;/STRONG&gt;, and&amp;nbsp;&lt;STRONG&gt;Azure Queue storage&lt;/STRONG&gt;.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;/FONT&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/storage/common/storage-introduction" target="_blank" rel="noopener"&gt;&lt;FONT size="3"&gt;Introduction to Azure Storage - Cloud storage on Azure | Microsoft Learn&lt;/FONT&gt;&lt;/A&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H4&gt;Managed Identities&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Azure Managed Identities are a feature of Azure Active Directory that automatically manages credentials for applications to use when connecting to resources that support Azure AD authentication. They eliminate the need for developers to manage secrets, credentials, certificates, and keys.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;There are two types of managed identities:&lt;/FONT&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;System-assigned: Tied to your application.&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;User-assigned: A standalone Azure resource that can be assigned to your app&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation:&amp;nbsp;&lt;/FONT&gt;&lt;A href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/overview" target="_blank" rel="noopener"&gt;&lt;FONT size="3"&gt;Managed identities for Azure resources - Managed identities for Azure resources | Microsoft Learn&lt;/FONT&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;H6&gt;&amp;nbsp;&lt;/H6&gt;
&lt;H2&gt;&lt;FONT size="5"&gt;Scenario&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;&lt;FONT size="3"&gt;Run an ADF / Synapse Pipeline that pulls a script located in a Storage Account and execute it into the Batch nodes using User Assigned Managed Identities (UAMI) for Authentication to Storage and System Assigned Managed Identity (SAMI) to authenticate with Batch.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;FONT size="5"&gt;Prerequisites&lt;/FONT&gt;&lt;/H4&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;&lt;EM&gt;ADF / Synapse Workspace&lt;/EM&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;A href="https://learn.microsoft.com/en-us/azure/synapse-analytics/quickstart-create-workspace" target="_blank" rel="noopener"&gt;Quickstart: create a Synapse workspace - Azure Synapse Analytics | Microsoft Learn&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;&lt;EM&gt;UA Managed Identity&lt;/EM&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;A href="https://learn.microsoft.com/en-us/entra/identity/managed-identities-azure-resources/how-manage-user-assigned-managed-identities?pivots=identity-mi-methods-azp" target="_blank" rel="noopener"&gt;Manage user-assigned managed identities - Managed identities for Azure resources | Microsoft Learn&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Blog Documentation: &lt;A href="https://techcommunity.microsoft.com/t5/azure-data-factory-blog/support-for-user-assigned-managed-identity-in-azure-data-factory/ba-p/2841013" target="_blank" rel="noopener"&gt;https://techcommunity.microsoft.com/t5/azure-data-factory-blog/support-for-user-assigned-managed-identity-in-azure-data-factory/ba-p/2841013&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;&lt;EM&gt;Storage Account&lt;/EM&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;/FONT&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/storage/common/storage-account-create?tabs=azure-portal" target="_blank" rel="noopener"&gt;&lt;FONT size="3"&gt;Create a storage account - Azure Storage | Microsoft Learn&lt;/FONT&gt;&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/UL&gt;
&lt;H6&gt;&amp;nbsp;&lt;/H6&gt;
&lt;H4&gt;&lt;FONT size="5"&gt;Procedure Overview&lt;/FONT&gt;&lt;/H4&gt;
&lt;P&gt;&lt;FONT size="3"&gt;During this procedure we will walk through step by step to complete the following actions:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Create UAMI Credentials&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Create Linked Services for Storage and Batch Accounts&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Add UAMI and SAMI to Storage and Batch Accounts&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Create, Configure and Execute an ADF / Synapse Pipeline&lt;/FONT&gt;&lt;/LI&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;We will refer to ADF (Portal, Workspace, Pipelines, Jobs, Linked Services) as Synapse during all the exercise and examples to avoid redundancy.&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Debugging&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H4&gt;&lt;FONT size="5"&gt;Procedure&lt;/FONT&gt;&lt;/H4&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Create UAMI Credentials&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;&lt;FONT size="3"&gt;1. In your Synapse Portal, go to Manage -&amp;gt; Credentials -&amp;gt; New and fill in the details and click&amp;nbsp;Create.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Create Linked Services Connections for Storage and Batch&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;2. In your Synapse Portal, go to Manage - Linked Services -&amp;gt; New -&amp;gt; Azure Blob Storage -&amp;gt; Continue and complete the form&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;a. Authentication Type: UAMI&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;b. Azure Subscription: Choose your one&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;c. Storage Account name: Choose your one where the script to be used is allocated&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;d. Credentials: choose the created into the Step #1&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;e. Click on Create&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;3. In Azure Portal go to your Batch Account -&amp;gt; Keys and Copy the Batch Account name &amp;amp; Account Endpoint to be used in next step, also copy the Pool Name to be used for this example.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;4. In your Synapse Portal, go to Manage -&amp;gt; Linked Services -&amp;gt; New -&amp;gt; Azure Batch -&amp;gt; Continue and fill in the information&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;a. Authentication Method: SAMI (Copy the Managed Identity Name to be used later)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;b. Account Name, Batch URL and Pool Name: Paste on here the values copied from Step#3&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;c. Storage linked service Name: Choose the one created from Step#2&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;&lt;FONT size="3"&gt;5. Publish all your changes&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Adding UAMI RBAC Roles to Storage Account&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;&lt;FONT size="3"&gt;6. In the Azure Portal, go to your Storage Account -&amp;gt; Access Control (IAM)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;a. Click on Add Option and then on Add role assignment and search for "Storage Blob Data Contributor", then click on Next.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;b. Choose Managed Identity and select your UAMI click on Select and then click Next, Next and Review + assign.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Adding SAMI RBAC Roles to Batch Account&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;&lt;FONT size="3"&gt;7. In the Azure Portal, go to your Batch Account -&amp;gt; Access Control (IAM)&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;a. Click on Add Option and then on Add role assignment&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;b. Click on "Privileged administrator roles" tab and then choose the Contributor role and click Next.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;c. Choose Managed Identity and under Managed Identity lookup for "Synapse workspace" and then choose the SAMI same as it is added into the step 4a., then click on Select and Next, Next and Review and Assign.&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Adding UAMI to Batch Pool&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;&lt;FONT size="3"&gt;If you need to create a new Batch Pool, you can follow the following procedure:&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Documentation: &lt;A href="https://learn.microsoft.com/en-us/azure/batch/managed-identity-pools" target="_blank" rel="noopener"&gt;Configure managed identities in Batch pools - Azure Batch | Microsoft Learn&lt;/A&gt;&lt;/FONT&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;FONT size="3"&gt;Make sure to select the UAMI configured into the Step 1&lt;/FONT&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;FONT size="3"&gt;8. If you already have a Batch Pool created follow the next steps:&lt;/FONT&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;a. Into the Azure Portal go to your Batch Account -&amp;gt; Pools -&amp;gt; Choose your Pool -&amp;gt; Go to Identity&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;&lt;FONT size="3"&gt;b. Click on Add then choose the necessary UAMI (on this example it was selected the one used by the Synapse Linked Services for Storage and another one used for other integrations) and click on Add.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT size="3"&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="3"&gt;&lt;EM&gt;&lt;STRONG&gt;Important&lt;/STRONG&gt;&lt;/EM&gt;: &lt;EM&gt;In case your Batch Pool use multiples UAMI's (as example to connect with Key Vault or other services), you have first to remove the existing one and then add all of them together.&lt;/EM&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;c. Then, it is required to Scale in and Scale out the Pool to apply the changes.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Setting up the Pipeline&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;9. In your Synapse Portal, go to Integrate -&amp;gt; Add New Resource -&amp;gt; Pipeline&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;10. Into the right panel Activities -&amp;gt; Batch Services -&amp;gt; Drag and drop the Custom activities&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;11. In the Azure Batch tab details for the Custom Activities, click on the Azure Batch linked service and click the one created in Step &lt;/SPAN&gt;&lt;SPAN&gt;4 and test the connection (if you receive a connection error, please go to the Troubleshooting scenario 1)&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;12. Then go to Settings tab and add your script. Ffor this example, we will use a Powershell script previously uploaded to a Storage Blob Container and send the output to txt file.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;a. Command: your script details&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;b. Resource linked Service: The Storage Service Linked connection configured previously on Step#2&lt;/P&gt;
&lt;P class="lia-indent-padding-left-30px"&gt;c. Browse Storage: lookup for the Container where your script was uploaded&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;d. Publish your Changes and perform a Debug&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H5&gt;&lt;FONT size="4"&gt;Debugging&lt;/FONT&gt;&lt;/H5&gt;
&lt;P&gt;12. Check the Synapse Jobs Logs and outputs&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a. Copy the Activity Run ID&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b. Then, in the Azure Portal Go to your Storage Account -&lt;/SPAN&gt;&lt;SPAN&gt;&amp;gt; Containers -&amp;gt; adfjobs -&amp;gt; select the folder with the activityID -&amp;gt; output.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;c. On here you will find two files, "stderr.txt" and "stdout.txt" both of them contains information about the errors or the outputs of the commands executed during the task execution&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;13. Check the Batch Logs and outputs. To get the Batch logs you have different ways:&lt;BR /&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;a. Over Nodes: In Azure Portal go to your Batch Account -&amp;gt; Pools -&amp;gt; Choose your Pool -&amp;gt; Nodes -&amp;gt; then into the Folders details go to the folder for this Synapse execution -&amp;gt; job-x -&amp;gt; lookup for the activityID &lt;BR /&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;BR /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;b. Over Jobs: In Azure Portal go to your Batch Account -&amp;gt; Jobs -&amp;gt; Select a pool with a name of adfv2-yourPoolName -&amp;gt; click on the Task with the ID same as it was the ActivityID of the Synapse Pipeline from step 12a.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;What we have learned&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;During this walkthrough procedure we have learned and implemented about&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Authentication&lt;/STRONG&gt;: Utilizing User Assigned Managed Identities (UAMI) and System Assigned Managed Identity (SAMI) for secure connections.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Linked Services&lt;/STRONG&gt;: Creation and configuration of linked services for Azure Storage and Azure Batch accounts.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Pipeline Execution&lt;/STRONG&gt;: Steps to create, configure, and execute an ADF/Synapse Pipeline, emphasizing the use of Synapse as a unified term to avoid redundancy.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Debugging&lt;/STRONG&gt;: Detailed instructions for creating credentials, adding RBAC roles, and setting up pipelines, along with troubleshooting tips.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Logs Analysis&lt;/STRONG&gt;: How to access and analyze Synapse Jobs logs and Azure Batch logs for troubleshooting.&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Error Handling&lt;/STRONG&gt;: Understanding the significance of ‘stderr.txt’ and ‘stdout.txt’ files in identifying and resolving errors during task execution.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;If you have any questions or feedback, please leave a comment below!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 27 May 2024 17:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/optimizing-etl-workflows-a-guide-to-azure-integration-and/ba-p/4138729</guid>
      <dc:creator>Josedobla</dc:creator>
      <dc:date>2024-05-27T17:00:00Z</dc:date>
    </item>
    <item>
      <title>Data Factory Increases Maximum Activities Per Pipeline to 80</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/data-factory-increases-maximum-activities-per-pipeline-to-80/ba-p/4096418</link>
      <description>&lt;P&gt;&lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;Data Factory pipeline developers create exciting and interesting data integration and ETL workflows for their data analytics projects. Because Data Factory is a platform service that is shared across ADF, Synapse, and Fabric, we had been limiting the number of activities in a single pipeline to 40 as a way to avoid resource exhaustion.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;!-- /wp:paragraph --&gt; &lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;However, just this week, we have doubled the&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/azure-resource-manager/management/azure-subscription-service-limits#azure-data-factory-limits" target="_blank" rel="noopener"&gt;limit on number of activities&lt;/A&gt;&amp;nbsp;you may define in a pipeline, from 40 to 80. With more freedom to develop, we want to empower you to create more powerful, versatile, and resilient data pipelines for all your business needs. We are excited to see what you come up with, harnessing the power of 40 more activities per pipeline!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;!-- wp:heading --&gt;&lt;/P&gt;
&lt;H2 id="toc-hId--572883774"&gt;What's the limit about &amp;amp; why did we raise it?&lt;/H2&gt;
&lt;P&gt;&lt;!-- /wp:heading --&gt; &lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;To ensure the resiliency and reliability of data pipelines, Data Factory places a limit on maximum number of activities that a pipeline may define. For the longest time, the limit has always been 40 activities per pipeline. Today, we are doubling it to 80, with future plans to raise it even further for our developers. The limit applies to the number of activities&amp;nbsp;&lt;EM&gt;defined,&amp;nbsp;&lt;/EM&gt;not actually run. For instance, in the following example with&amp;nbsp;&lt;A href="https://learn.microsoft.com/azure/data-factory/tutorial-pipeline-failure-error-handling#conditional-paths" target="_blank" rel="noopener"&gt;conditional branching&lt;/A&gt;, there are 3 activities defined, even though, realistically speaking, in any pipeline run, only 2 will actually run.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We understand that our customers want to build resilient and useful data pipelines for their business needs, and sometimes, the 40 activities limit may come in the way of development. Hence, we are doubling the ceiling limit and giving you 40 more activities in a pipeline.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;!-- wp:heading --&gt;&lt;/P&gt;
&lt;H2&gt;When to add more activities?&lt;/H2&gt;
&lt;P&gt;&lt;!-- /wp:heading --&gt; &lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;We strongly encourage customers to use the additional 40 activities to build&amp;nbsp;&lt;A href="https://review.learn.microsoft.com/azure/data-factory/tutorial-pipeline-failure-error-handling?branch=pr-en-us-268211" target="_blank" rel="noopener"&gt;error handling capabilities&lt;/A&gt;. For instance, send an email to my on-call alias when Copy activities failed, otherwise proceed.&lt;/P&gt;
&lt;P&gt;&lt;!-- /wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Or build a try-catch block that attempts to move the data if it's ready or move on otherwise.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Build for Resilience and Retries!&lt;/H3&gt;
&lt;P&gt;&lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;We do not, however, encourage you to build a sequential pipeline, with 80 activities one after another. Please be aware that data pipelines, just like any other piece of software, can sometimes encounter failures. For instance, when the connection to your SQL server is throttling and a copy activity cannot complete in time.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;!-- /wp:paragraph --&gt; &lt;!-- wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;In those cases, you need to retry and restart the pipeline. Please bear this information in mind, as you develop your pipeline: keep the actual steps within a pipeline to a reasonable amount. Production engineers will thank you to keep their lives simple.&amp;nbsp;&lt;!-- /wp:paragraph --&gt;&lt;span class="lia-unicode-emoji" title=":slightly_smiling_face:"&gt;🙂&lt;/span&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;
&lt;H3&gt;Final Thoughts&lt;/H3&gt;
&lt;P&gt;With the power of data pipelines, we want you to be able to build and deliver business impact for your end users. We excited to see what you come up with, now with the power of 40 more activities!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Have any questions or feedback? Leave a comment below!&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;!-- /wp:paragraph --&gt;&lt;/P&gt;
&lt;P&gt;&lt;!-- /wp:paragraph --&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 29 Mar 2024 17:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/data-factory-increases-maximum-activities-per-pipeline-to-80/ba-p/4096418</guid>
      <dc:creator>Noelle_Li</dc:creator>
      <dc:date>2024-03-29T17:00:00Z</dc:date>
    </item>
    <item>
      <title>Action Required: Switch from Memory Optimized Data Flows in Azure Data Factory to General Purpose</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/action-required-switch-from-memory-optimized-data-flows-in-azure/ba-p/4096314</link>
      <description>&lt;P&gt;Azure Data Factory Memory Optimized Data Flows will be fully retired on April 1, 2027. Going forward, all ADF Data Flows will use the General Purpose SKU that will provide performance that is superior to the current Memory Optimized and at the General-Purpose price.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;How does this affect me?&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;Beginning April 1, 2024, the creation of new Azure Data Factory Memory Optimized Data Flows will be discontinued until it is fully retired on April 1, 2027.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Existing pipelines can continue to use existing Memory Optimized data flows, but you will not be able to create new Azure Integration Runtimes using Memory Optimized. You will be able to use General Purpose ADF Data Flows, which will provide better performance at a lower price.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Required action&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;To avoid disruptions, we recommend the following actions:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;When creating new data flows, create a new Azure Integration Runtime using General Purpose instead of Memory Optimized.&lt;/LI&gt;
&lt;LI&gt;Then assign General Purpose IRs to existing and new data flows instead of using Memory Optimized.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;&lt;STRONG&gt;Help and Support&lt;/STRONG&gt;&lt;/H3&gt;
&lt;P&gt;If you have questions, get answers from community experts in Microsoft Q&amp;amp;A or email our team.&lt;/P&gt;
&lt;P&gt;If you have a support plan and require technical support, please create a support request.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Under &lt;EM&gt;Issue type&lt;/EM&gt;, select Technical.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Under &lt;EM&gt;Subscription&lt;/EM&gt;, select your subscription.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Under &lt;EM&gt;Service&lt;/EM&gt;, select My services, then select Data Factory.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Under &lt;EM&gt;Summary&lt;/EM&gt;, type a description of your issue.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Under &lt;EM&gt;Problem type&lt;/EM&gt;, select Mapping Data Flow&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Let us know in the comments if you have any questions or feedback!&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Mon, 25 Mar 2024 23:57:50 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/action-required-switch-from-memory-optimized-data-flows-in-azure/ba-p/4096314</guid>
      <dc:creator>Noelle_Li</dc:creator>
      <dc:date>2024-03-25T23:57:50Z</dc:date>
    </item>
    <item>
      <title>Continued region expansion: Azure Data Factory is generally available in two more regions</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/4029391</link>
      <description>&lt;P&gt;&lt;A href="https://azure.microsoft.com/en-us/services/data-factory/" target="_self" data-bi-an="body" data-bi-tn="undefined"&gt;Azure Data Factory&lt;/A&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;is now available in two new regions:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Israel Central&lt;/LI&gt;
&lt;LI&gt;Italy North&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;You can now provision Data Factory&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;in the new regions in order to co-locate your Extract-Transform-Load logic with your data lake and compute.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;See the full set of&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://azure.microsoft.com/en-us/global-infrastructure/services/?cdn=disable&amp;amp;products=data-factory" target="_self" data-bi-an="body" data-bi-tn="undefined"&gt;Azure Data Factory supported regions&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Wed, 17 Jan 2024 18:00:16 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/4029391</guid>
      <dc:creator>Chunhua</dc:creator>
      <dc:date>2024-01-17T18:00:16Z</dc:date>
    </item>
    <item>
      <title>Continued region expansion: Azure Data Factory is generally available in Poland Central</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/3965769</link>
      <description>&lt;P style="margin-left: .375in; margin-top: 9pt; margin-bottom: 9pt; font-family: 'Segoe UI'; font-size: 12.0pt; color: #4c4c51;"&gt;&lt;SPAN&gt;Azure Data Factory is now available in &lt;STRONG&gt;Poland Central&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin-left: .375in; margin-top: 9pt; margin-bottom: 9pt; font-family: 'Segoe UI'; font-size: 12.0pt; color: #4c4c51;"&gt;&lt;SPAN&gt;You can now provision Data Factory&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;in the new region in order to co-locate your Extract-Transform-Load logic with your data lake and compute.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P style="margin-left: .375in; margin-top: 9pt; margin-bottom: 9pt; font-family: 'Segoe UI'; font-size: 12.0pt;"&gt;&lt;SPAN&gt;See the full set of&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://azure.microsoft.com/en-us/global-infrastructure/services/?cdn=disable&amp;amp;products=data-factory" target="_blank" rel="noopener"&gt;&lt;SPAN&gt;Azure Data Factory supported regions&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN&gt;.&lt;/SPAN&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 27 Oct 2023 19:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-is-generally/ba-p/3965769</guid>
      <dc:creator>Chunhua</dc:creator>
      <dc:date>2023-10-27T19:00:00Z</dc:date>
    </item>
    <item>
      <title>General Availability of Time to Live (TTL) for Managed Virtual Network in Azure Data Factory</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/general-availability-of-time-to-live-ttl-for-managed-virtual/ba-p/3922218</link>
      <description>&lt;P&gt;In the fast-paced world of data integration, where seamless and secure data movement is paramount, Azure Data Factory (ADF) stands as a trusted orchestrator of data workflows. Today, we are thrilled to announce a significant enhancement to ADF's capabilities - the General Availability of ADF Managed Virtual Network Time to Live (TTL).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;What is Managed Virtual Network TTL?&lt;/H1&gt;
&lt;P&gt;Before we delve into the benefits and use cases, let's understand what Managed Virtual Network TTL is all about.&lt;/P&gt;
&lt;P&gt;Time to Live (TTL) is a crucial enhancement for Azure integration runtimes within a Managed Virtual Network. It allows you to specify a TTL value and Data Integration Unit (DIU) numbers required for various data integration activities. The TTL feature helps to manage compute resources more effectively, reduce startup times, and optimize overall performance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Key Benefits of Managed Virtual Network TTL&lt;/H1&gt;
&lt;P&gt;Now, let's explore the key benefits of Managed Virtual Network TTL and why it's a game-changer for your data integration workflows:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;STRONG&gt; Improved Performance&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;One of the challenges in Managed Virtual Network is managing the startup time of compute resources, especially when dealing with multiple copy activities or complex pipelines. Managed Virtual Network TTL addresses this by keeping computes alive for a certain period after their execution completes. If a new copy activity starts during the TTL time, it will reuse existing computes, significantly reducing startup time and enhancing overall performance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&lt;STRONG&gt; Compute Size Flexibility&lt;/STRONG&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;With Managed Virtual Network TTL, you have the flexibility to select from pre-defined compute sizes or customize the compute size based on your specific requirements and real-time needs. This customization ensures that your compute resources are optimally sized for the tasks at hand.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Pipeline and External Activity&lt;/H1&gt;
&lt;P&gt;Time to Live (TTL) isn't just limited to copy activities; you can also tailor the compute size and TTL duration for pipeline and external activities, ensuring your data integration processes are finely tuned to your specific requirements.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Monitoring Your Managed Virtual Network&lt;/H1&gt;
&lt;P&gt;Azure Data Factory's Managed Virtual Network TTL feature brings a new level of control and efficiency to your data integration workflows. By allowing you to manage compute resources effectively and reduce startup times, it optimizes performance. However, to ensure that your data integration processes are running smoothly within this secure environment, you need visibility and monitoring. In Azure Data Factory, we also provide some new metrics to help you identify the issues and bottlenecks.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Learn more about monitoring: &lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/monitor-managed-virtual-network-integration-runtime" target="_blank" rel="noopener"&gt;Monitor an integration runtime within a managed virtual network - Azure Data Factory | Microsoft Learn&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H1&gt;Embrace ADF Managed Virtual Network TTL&lt;/H1&gt;
&lt;P&gt;We are excited to bring you this enhancement to Azure Data Factory, and we look forward to seeing how it transforms your data integration processes. &lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/managed-virtual-network-private-endpoint" target="_blank" rel="noopener"&gt;Get started with Managed Virtual Network TTL today&lt;/A&gt; and unlock a new level of efficiency and security in your data workflows.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 11 Oct 2023 04:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/general-availability-of-time-to-live-ttl-for-managed-virtual/ba-p/3922218</guid>
      <dc:creator>lrtoyou1223</dc:creator>
      <dc:date>2023-10-11T04:00:00Z</dc:date>
    </item>
    <item>
      <title>Metadata Driven Pipelines for Dynamic Full and Incremental Processing in Azure SQL</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/metadata-driven-pipelines-for-dynamic-full-and-incremental/ba-p/3925362</link>
      <description>&lt;P&gt;Developing ETLs/ELTs can be a complex process when you add in business logic, large amounts of data, and the high volume of table data that needs to be moved from source to target. This is especially true in analytical workloads involving Azure SQL when there is a need to either fully reload a table or incrementally update a table. In order to handle the logic to incrementally update a table or fully reload a table in Azure SQL (or Azure Synapse), we will need to create the following assets:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;Metadata table in Azure SQL&amp;nbsp;
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;This will contain the configurations needed to load each table end to end&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Metadata driven pipelines
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Parent and child pipeline templates that will orchestrate and execute the ETL/ELT end to end&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Custom SQL logic for incremental processing
&lt;UL class="lia-list-style-type-circle"&gt;
&lt;LI&gt;Dynamic SQL to perform the delete and insert based on criteria the user provides in the metadata table&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;*This article uses Azure SQL DB as the source and sink databases. However, Azure SQL MI, On-Prem SQL, and Synapse Dedicated Pools (along with Synapse Pipelines) will also be compatible for this solution. As a source, you can use databases like MySQL, Oracle, and others. You will just need to adjust the query syntax/connections to match the desired source.&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;STRONG&gt;Scenario&lt;/STRONG&gt;&lt;/H2&gt;
&lt;P&gt;There is a need to load SQL tables from a SQL Server source on a daily frequency or multiple times a day. The requirements are to land the data first in ADLS Gen 2, and then finally load the tables into Azure SQL DB with the correct processing (incremental or full) while using a dynamic pipeline strategy to limit the number of objects used.&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;&lt;FONT size="6"&gt;&lt;STRONG&gt;Metadata Table&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/H2&gt;
&lt;P&gt;The first set up that is required in our dynamic ETL is going to be a metadata (sometimes called "config" table) table on the destination SQL server environment. This table contains all of the information that is needed to pass into the ADF pipelines to determine the source query, ADLS Gen 2 storage location and metadata, processing metadata, staging metadata, and other metadata critical to performing the ETL. An example of a metadata table design and sample are below.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Metadata table definition&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;CREATE TABLE [meta].[ADLS_Metadata](
	[FileName] [varchar](100) NULL,
	[StorageAccount] [varchar](100) NULL,
	[StorageContainer] [varchar](100) NULL,
	[ContainerDirectoryPath] [varchar](100) NULL,
	[LoadType] [varchar](25) NULL,
	[LoadIndicator] [varchar](25) NULL,
	[SourceSchema] [varchar](25) NULL,
	[SourceTable] [varchar](100) NULL,
	[StagingSchema] [varchar](25) NULL,
	[StagingTable] [varchar](100) NULL,
	[TargetSchema] [varchar](25) NULL,
	[TargetTable] [varchar](100) NULL,
	[ColumnKey] [varchar](500) NULL,
	[WaterfallColumn] [varchar](100) NULL,
	[TableColumns] [varchar](1000) NULL
) ON [PRIMARY]
GO&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Sample output of metadata table&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The ETL will be facilitated entirely from this metadata table. Any tables that are not included within this table, would not be executed in our ETL pipelines. Any new tables or work that are needed to be added, simply insert them into the metadata table and they will be available when the pipeline is triggered, &lt;STRONG&gt;without&amp;nbsp;&lt;/STRONG&gt;needing to alter the ADF pipelines.&amp;nbsp;Whether the data is going to the same storage container or a different one, different databases, etc. the metadata table allows you dictate where, what, and how of your ETL from one central location. This is a simple metadata table example, but you can make this as robust as you desire by adding in test flags, different load frequency indicators, and many others.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;&lt;STRONG&gt;Metadata Driven Pipelines&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;Now that the metadata table is constructed, time to build the dynamic ADF pipelines to orchestrate and execute the ETL.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Here are the ADF objects needed to execute the ETL for 'N' number of tables. These will be shown in steps below. It is important the note the power of the dynamic metadata driven pipelines, they are able to execute/facilitate an enterprise level ETL with only 3 pipelines, 2-3 linked services, and 2-3 datasets in this scenario.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;Linked Services:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Source SQL Server*
&lt;UL&gt;
&lt;LI&gt;Authenticated with system-assigned managed identity.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;Sink SQL Server*
&lt;UL&gt;
&lt;LI&gt;Authenticated with system-assigned managed identity.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;ADLS Gen 2 Storage
&lt;UL&gt;
&lt;LI&gt;Authenticated with system-assigned managed identity.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;*&lt;EM&gt;IF the source SQL Server and sink are the same service with the same authentication and integration runtime then you only need one linked service. Ex. both are Azure SQL DBs with the same authentication. However, if the authentication differs or they are different services (Azure SQL DB vs Azure SQL MI) then create one dynamic linked service for each.&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Datasets:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Source SQL Server Dataset*&lt;/LI&gt;
&lt;LI&gt;Sink SQL Server Dataset*&lt;/LI&gt;
&lt;LI&gt;ADLS Gen 2 Storage Dataset&lt;/LI&gt;
&lt;LI&gt;*&lt;EM&gt;One dataset per linked service. Separate datasets may not be needed if you have one dynamic linked service.&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;Pipelines:&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Main Orchestration Pipeline&lt;/LI&gt;
&lt;LI&gt;Full Load Processing Pipeline&lt;/LI&gt;
&lt;LI&gt;Incremental Processing Pipeline&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size="5"&gt;Linked Service Creation&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;In this scenario, the source and sink SQL environments&amp;nbsp;are both Azure SQL DB with the same authentication, so there will be only one linked service created with parameters to handle the dynamic use. Feel free to use your own naming conventions for the objects and parameters, just be sure they are generic and descriptive. Ex. not using "parameter1" or "linkedService1".&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt; The generic name of the linked service will be "AzureSQLDB". The domain name and database name are referenced from the parameters that we created in the linked service to pass this connection information at runtime from the pipelines. Default values are available and will be used if there are not values passed through the pipeline.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The same pattern will be used for the ADLS Gen 2 linked service. In this linked service, there is a generic name used "ADLSGen2" and only the storage account parameter is used. There is no path specification used here to allow the use of the linked service for all containers and paths using the same authentication method and Integration Runtime. The path and file will be optional parameters of the dataset that references this linked service.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size="5"&gt;Dataset Creation&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;The dataset will created and using the linked services that were created above. There needs to be the parameters that are used in the linked service as well as additional parameters. The parameter names will align with the metadata table column names to provide ease of use.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;For the SQL environment, there needs to be the parameters "serverName" and "databaseName" which come from the linked service. Then adding the parameters "schemaName" and "tableName" to have the ability to query/use all tables in a server or database using that linked service. Create the parameters first on the "Parameters" tab and then use the 'add dynamic content' to place the reference to the parameters that were just created. These parameters will be exposed/prompted when referenced in the pipelines that are created later in this article.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For ADLS Gen 2 storage, there will be a dataset for each type of file and compression. In this scenario, the data will be stored as Parquet files with snappy compression. The same concept as above is used for the parameters. For the linked service, the parameter is created on the dataset "storageAccountName". Then dataset specific parameters to identify all possible containers, paths and files within the dataset are "storageContainer", "containerDirectoryPath", and "fileName".&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;&lt;FONT size="5"&gt;Pipeline and ETL Creation&lt;/FONT&gt;&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;With the metadata table, linked services, and datasets created, it is time to build out the metadata driven pipelines. The walkthrough below is split up into the 3 different pipelines, the main orchestration (parent) pipeline, full processing pipeline (child), and incremental processing pipeline (child). These pipelines are organized into folders for ease of access/formatting. The folders are virtual and offer no functionality&amp;nbsp;other than organization in the UI. The folders are "Orchestration" which houses the main parent pipeline and "ETL" which contains the children pipelines that perform the processing.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="5"&gt;&lt;STRONG&gt;Main Orchestration pipeline:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;The main orchestration pipeline in this example is called "adventureWorks_Main". This pipeline will have a trigger associated with it and will control the execution of the whole ETL. This is the design of the pipeline in the UI, and each activity will be described.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;On the parent pipeline, it is critical to have pipeline parameters to allow this process to be dynamic. These pipeline parameters will be used throughout the activities, and passed to the children pipelines. They will look familiar as they will be used in the dynamic datasets, linked services, and querying the metadata table.&amp;nbsp;&lt;/FONT&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;STRONG&gt;sourceServerName&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;source server connection to passed through the parameterized dataset to the parameterized linked service&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;sourceDatabaseName&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;source database connection to passed through the parameterized dataset to the parameterized linked service&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;targetServerName&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Target server connection to passed through the parameterized dataset to the parameterized linked service.&amp;nbsp;Typically where your metadata table lives as well.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;targetDatabaseName&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;Target database connection to passed through the parameterized dataset to the parameterized linked service. Typically where your metadata table lives as well.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;loadIndicator&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;This is a frequency/use indicator. 'Daily' is an example that signifies the table is loaded daily. This is used as a filter. So, you can place'Test' or some other value to control which tables and different frequencies or uses to execute.
&lt;UL&gt;
&lt;LI&gt;Ex. 'Testing Only', 'Monthly', 'Hourly'. The frequency would correspond with a trigger frequency as well.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;STRONG&gt;waterfallLookbackDays&lt;/STRONG&gt;
&lt;UL&gt;
&lt;LI&gt;The amount of days to incrementally process. Used only to find the changed rows in incremental data sources. Requires a reliable date stamp that corresponds to tracked inserts and updates.
&lt;UL&gt;
&lt;LI&gt;Ex. rows that have been updated within the last 120 days (-120)&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;LI&gt;There are many ways to incrementally process, and this is just one used in the example. This article discusses using waterfall column/columns. You would just need to adjust the parameters, syntax, and dynamic script to fit your criteria.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The full reload path and the incremental reload path have the same activities and pattern, however they differ in 2 ways.&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Look up query. Specifically, the WHERE clause&lt;/LI&gt;
&lt;LI&gt;The parameters passed to the 'Execute Pipeline' activity within the 'ForEach Loop'&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;&lt;STRONG&gt;Full Reload Pattern/Queries:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;Use a look up to extract the rows based on the SQL query criteria -&amp;gt; pass that result set to the for each loop and iterate over each table to perform the loading in the full load processing pipeline.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Lookup Activity - Full Reload:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Inside the look up activity - "Full Reload - Lookup Metadata".&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;The parameters defined on the dataset appear as properties within the activity using the dataset. The lookup activity will query the metadata table, which lives in the target server. This uses the pipeline parameters. The "schemaName" and "tableName" parameters are not needed since the lookup activity is performing a query, so placing a "x" value allows the pipeline to validate even though these are not used.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dynamic content for "serverName" parameter&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@pipeline().parameters.targetServerName&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dynamic content for the query. The pipeline parameter for "loadIndicator" is used in the SQL query as well as a hard coded filter for "Full" load types.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT LoadType, TargetTable 
FROM 
	meta.ADLS_Metadata
WHERE 
	LoadIndicator = '@{pipeline().parameters.loadIndicator}'
	AND LoadType = 'Full'&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Sample query output:&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For Each Loop - Full Reload:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The next step is to iterate through the output in the for each loop. Use the settings tab to define the items from the full reload lookup.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Full Reload - Lookup Metadata').output.value&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Inside the for each loop, an execute pipeline activity will be used to call the full load processing pipeline (child). There are parameters on the child pipeline that are required to enter when executing. The parameters are going to be the pipeline parameters (from the parent pipeline) EXCEPT for a new parameter called 'targetTable'. The 'targetTable' comes from the item value that we are iterating from the output of look up activity.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="5"&gt;&lt;STRONG&gt;Full Reload - Processing Pipeline (child)&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The processing pipeline called "adventureWorks_FullLoad" is executed from the parent pipeline with the pipeline parameters being passed from parent to child. Because this pipeline is called within a for each loop, each table that is being iterated will be have their own execution from this pipeline. The overall purpose and design of this pipeline is:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Extract source data&lt;/LI&gt;
&lt;LI&gt;Load source data to ADLS Gen 2 storage&lt;/LI&gt;
&lt;LI&gt;Full reload of data from ADLS Gen 2 to Azure SQL DB&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Lookup Activity:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This will be the same dataset and configuration for the use of pipeline parameters as the parent pipeline lookup activity with the only difference being the query that is being passed through.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Query used in dynamic content. This will return all the columns associated with the row, there should only be one row returned, if there are multiple due to the addition of different testing scenarios/frequencies, then refine the filtering logic for the appropriate context.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT * 
FROM 
	meta.ADLS_Metadata
WHERE 
	TargetTable = '@{pipeline().parameters.targetTable}'
	AND LoadIndicator = '@{pipeline().parameters.loadIndicator}'&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Copy data to ADLS Gen 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The metadata gathered from the look up activity is used to extract the source table data and load to the location in ADLS Gen 2 specified by the metadata.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Source' - The pipeline parameters for the source server and source database are used for "serverName" and "databaseName". Then the output from the lookup provides the "schemaName" and "tableName". This time, a table is used instead of a query.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Example of activity output use in a parameter.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Full Load - Lookup Metadata').output.firstRow.SourceSchema&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Sink' - all the parameters are populated from the lookup activity reading from the metadata table. This creates a path for each file. Each file will be overwritten with every execution. If you wish to retain historical copies of the loads, you can add an archive step to move the files from this location and/or add customer logic for date suffixes in the expression builder.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Example of storage container with loaded files&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Copy Data to Azure SQL DB:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;Once the data has been landed into ADLS Gen 2 as parquet files, it is time to load the files into the Azure SQL DB using another Copy activity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Source' - this will be the same configuration as the 'Sink' of the previous copy activity. Using the output from the lookup activity which contains the metadata table result.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Sink' - The dataset parameters will be populated with the pipeline parameters for the "targetServerName" and "targetDatabaseName". The "schemaName" and "tableName" are populated from the lookup activity output.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There is a 'Pre-copy script' that is being executed to truncate the table if it exists already. If the table does not exist, the script will not try to truncate the table, and the 'Table option' of 'Auto create table' being selected will handle any new tables. The write behavior will be 'Insert' since there is a full reload.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;If schema drift is present, one solution is to replace the truncate with a drop instead to recreate the table each execution. That has other risks associated with it that need to be considered.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Pre-copy script using pipeline parameters and lookup activity output parameters&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '@{activity('Full Load - Lookup Metadata').output.firstRow.TargetSchema}' AND TABLE_NAME =  '@{activity('Full Load - Lookup Metadata').output.firstRow.TargetTable}' )
BEGIN 
TRUNCATE TABLE [@{activity('Full Load - Lookup Metadata').output.firstRow.TargetSchema}].[@{activity('Full Load - Lookup Metadata').output.firstRow.TargetTable}] 
END
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="6"&gt;&lt;STRONG&gt;Incremental Load Pattern/Queries:&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="4"&gt;The incremental processing load is going to be very similar the full reload processing method, with differences being in the filtering of lookup activities, additional parameters, and different methods to perform the loading inside the processing pipeline.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Lookup Activity - Incremental Load&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This lookup activity will be the exact same dataset configuration as the full reload version, with the minor change of 'Incremental' being hard coded as the WHERE clause 'LoadType' filter instead of 'Full'. The parameters are still using the pipeline parameters to connect to the metadata table.&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT LoadType, TargetTable 
FROM 
	meta.ADLS_Metadata
WHERE 
	LoadIndicator = '@{pipeline().parameters.loadIndicator}'
	AND LoadType = 'Incremental'&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;For Each Loop - Incremental Load&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The for each loop will use the output from the incremental reload lookup activity output in the 'Items'.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Incremental Reload - Lookup Metadata').output.value&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Inside the for each loop, there is an execute pipeline activity which calls the incremental reload processing pipeline (child). There is one extra parameter that was not used in the full reload processing pipeline execution - 'waterfallLookbackDays' (pipeline parameter).&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="5"&gt;&lt;STRONG&gt;Incremental Reload - Processing Pipeline (child)&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The processing pipeline called "adventureWorks_IncrementalLoad" is executed from the parent pipeline with the pipeline parameters being passed from parent to child. Because this pipeline is called within a for each loop, each table that is being iterated will be have their own execution from this pipeline. The overall purpose and design of this pipeline is (differs slightly from the full reload):&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;Extract source data&lt;/LI&gt;
&lt;LI&gt;Load source data to ADLS Gen 2 storage&lt;/LI&gt;
&lt;LI&gt;Full reload of data from ADLS Gen 2 to a&amp;nbsp;&lt;EM&gt;staging table&lt;/EM&gt; in Azure SQL DB&lt;/LI&gt;
&lt;LI&gt;Dynamic delete and insert from staging table into production table within Azure SQL DB&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Lookup Activity:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This will be the same as the full reload version of the query and the dataset configuration.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;SELECT * 
FROM 
	meta.ADLS_Metadata
WHERE 
	TargetTable = '@{pipeline().parameters.targetTable}'
	AND LoadIndicator = '@{pipeline().parameters.loadIndicator}'&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Copy Data to ADLS Gen 2:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This activity is where the main difference between the full reload and the incremental loads start.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Source' - instead of the table, there will a query used. This query will utilize the 'waterfallColumn' value from the metadata table lookup and the 'waterfallLookbackDays' pipeline parameter to filter the results to only that time period. This will allow the query to build for each table dynamically and return a subset of the source table regardless of where the source is, the table, etc.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Query using dynamic content&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;@concat(
    'SELECT * 
     FROM ', '[', activity('Incremental Load - Lookup Metadata').output.firstRow.SourceSchema, '].[', activity('Incremental Load - Lookup Metadata').output.firstRow.SourceTable, '] ',
     'WHERE ', 'CONVERT(DATE, ', activity('Incremental Load - Lookup Metadata').output.firstRow.WaterfallColumn, ') &amp;gt;= DATEADD(DAY,', pipeline().parameters.waterfallLookbackDays, ', GETDATE())'  )&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;If the source is different than SQL, you can adjust the dynamic query to match the syntax for the source environment like Oracle, MySQL, etc.&amp;nbsp;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In the 'Sink' - the configuration will the same as the full reload. The dataset parameters will come from the lookup activity output on the same dataset.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Incremental Load - Lookup Metadata').output.firstRow.StorageAccount&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Copy Data from ADLS Gen 2 to Stage Table in Azure SQL DB:&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;The next step is to load the data from ADLS Gen 2 into a staging table to prep to perform the incremental processing. The staging table allows for temporary data to be stored and leverage the full compute power of the Azure SQL DB, as well as maintaining more control over the processing.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In both 'Source' and 'Sink' - The configurations that are used will be the same as the full reload version, with the only differences being the parameters are pointing to the staging table referenced in the metadata table instead of the final version of the table. This table is in a different schema and has a 'STAGE_' prefix on the table name. In the 'Sink', the process of truncating the table pre copy, full loading, and/or auto creating tables that don't exist is the same.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Incremental Load - Lookup Metadata').output.firstRow.FileName&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Pipeline parameter example for 'tableName' pointing to the 'StagingTable'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Incremental Load - Lookup Metadata').output.firstRow.StagingTable&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Pre-copy script - referencing the staging tables&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '@{activity('Incremental Load - Lookup Metadata').output.firstRow.StagingSchema}' AND TABLE_NAME =  '@{activity('Incremental Load - Lookup Metadata').output.firstRow.StagingTable}' )
BEGIN
TRUNCATE TABLE [@{activity('Incremental Load - Lookup Metadata').output.firstRow.StagingSchema}].[@{activity('Incremental Load - Lookup Metadata').output.firstRow.StagingTable}]
END
&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Dynamic Delete and Insert Script&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;This step is what actually performs the incremental processing of the tables. It will delete the rows that are in the staging table (simulating that data has changed and needs to be either updated or inserted) and then insert the staging table rows into the production table. The script will be provided and explained below.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This is a 'Script' activity with the linked service parameters pointing to the location of the target tables and metadata table. There is also an input script parameter 'FileName' that uses the 'FileName' value from the lookup activity. The option for 'NonQuery' is selected since this script performs a DDL statement and does not return a result. If a result was being returned instead of DDL statements, then 'Query' would be selected.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;FileName parameter dynamic content&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@activity('Incremental Load - Lookup Metadata').output.firstRow.FileName&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Dynamic Delete and Insert SQL Script&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;--DECLARE @FileName VARCHAR (500) -- Manual Runs inside procedure will toggle this for troublshooting
DECLARE @TargetTable VARCHAR (500)
DECLARE @StagingTable VARCHAR (500)
DECLARE @WhereClause VARCHAR(MAX) 
DECLARE @StagingSchema VARCHAR (50)
DECLARE @TargetSchema VARCHAR (50)
DECLARE @FullStagingTableName VARCHAR (500)
DECLARE @FullTargetTableName VARCHAR (500)
DECLARE @TargetTableColumnList NVARCHAR(MAX)
DECLARE @DeleteStatementSQL NVARCHAR (MAX)
DECLARE @InsertStatementSQL NVARCHAR (MAX)
DECLARE @StatisticsUpdateSQL NVARCHAR (MAX)


--SET @FileName = 'SalesOrderHeader.parquet' -- Manual Runs inside procedure will toggle this for troublshooting
SET @TargetTable = (SELECT TargetTable FROM meta.ADLS_Metadata WHERE FileName = @FileName)
SET @TargetSchema = (SELECT TargetSchema FROM meta.ADLS_Metadata WHERE FileName = @FileName)
SET @StagingTable = (SELECT StagingTable FROM meta.ADLS_Metadata WHERE FileName = @FileName)
SET @StagingSchema = (SELECT StagingSchema FROM meta.ADLS_Metadata WHERE FileName = @FileName)
SET @FullStagingTableName = CONCAT(@StagingSchema, '.', @StagingTable)
SET @FullTargetTableName = CONCAT(@TargetSchema, '.', @TargetTable)
SET @TargetTableColumnList = (	SELECT 
									ColumnList = STRING_AGG('[' + col.NAME + ']', ',' )
								FROM
									sys.tables tab
										LEFT JOIN 
									sys.schemas sch
										ON tab.schema_id = sch.schema_id
										LEFT JOIN 
									sys.columns col
										ON tab.object_id = col.object_id
								WHERE 
									sch.name = @TargetSchema
									AND tab.name = @TargetTable
									AND col.is_identity = 0
							)
 ;

WITH PrimaryKeyList AS (
						SELECT 
							ColumnKey = RTRIM(LTRIM(Value)),
							RowNumber = ROW_NUMBER () OVER (ORDER BY value ASC)

						FROM
							meta.ADLS_Metadata
								CROSS APPLY 
							STRING_SPLIT( ColumnKey, ',')
						WHERE 
							FileName = @FileName
						)
 
 /******* Section for single primary key OR Keys that do not need to be concated to be uniquely identified *********************/
        SELECT
            @WhereClause =   STRING_AGG(CASE 
                                            WHEN E.ColumnKey IS NOT NULL THEN CONCAT( Beg.ColumnKey,' IN (SELECT ', Beg.ColumnKey, ' FROM ', @FullStagingTableName, ') AND')
                                            ELSE CONCAT( Beg.ColumnKey,' IN (SELECT ', Beg.ColumnKey, ' FROM ', @FullStagingTableName, ')' )
                                        END, ' ')
        FROM 
            PrimaryKeyList Beg
                LEFT JOIN
            PrimaryKeyList E
                ON Beg.Rownumber = E.Rownumber - 1 
                ;
/***************************************************************************************************************************************/

/************************* Section used to concat a composite key and create the unique identifier during the load process if it does not exist in the source tables *******************
SELECT
    @WhereClause = CONCAT(	'CONCAT(', 
							STRING_AGG(CASE 
											WHEN E.ColumnKey IS NOT NULL THEN  Beg.ColumnKey
											ELSE CONCAT(Beg.ColumnKey, ') ')
										END, ', '
										),
							'IN (SELECT CONCAT(', 
							STRING_AGG(CASE 
											WHEN E.ColumnKey IS NOT NULL THEN  Beg.ColumnKey
											ELSE CONCAT(Beg.ColumnKey, ') ')
										END, ', '
										),
							'FROM ', @FullStagingTableName, ')'
						)
FROM 
    PrimaryKeyList Beg
        LEFT JOIN
    PrimaryKeyList E
        ON Beg.Rownumber = E.Rownumber - 1 
        ;
 
 *********************************************************************************************************************************************************/
 
SELECT
    @DeleteStatementSQL = CONCAT('DELETE FROM ', @FullTargetTableName, ' WHERE ', @WhereClause) ;
 
SELECT 
    @InsertStatementSQL = CONCAT('INSERT INTO ', @FullTargetTableName, ' (', @TargetTableColumnList, ') ', ' SELECT ', @TargetTableColumnList, ' FROM ', @FullStagingTableName)
 
--SELECT 
--	@StatisticsUpdateSQL = CONCAT('UPDATE STATISTICS ', @FullTargetTableName) 

--PRINT @DeleteStatementSQL
--PRINT @InsertStatementSQL
--PRINT @StatisticsUpdateSQL
 
EXECUTE sp_executesql @DeleteStatementSQL ; 

EXECUTE sp_executesql @InsertStatementSQL ;

--EXECUTE sp_executesql @StatisticsUpdateSQL ; Used in Dedicated SQL Pool to update statistics once tables have been loaded&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;See examples of the different steps of the script below for the table 'SalesOrderHeader'&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Metadata table results for the staging table, target table, and the primary keys for the target table 'SalesOrderHeader'. You will notice that this table has multiple primary keys to provide the unique record for the data. This script will handle multiple primary keys or single primary keys in a method shown later.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;First, the variables are built. One important variable is&amp;nbsp;@TargetTableColumnList which compiles a comma separated list of the target table columns from the system tables. You will not need to maintain the columns in the target table since the script will compile a list from the system tables and exclude identity columns since these are not updated or inserted. If that is needed, then logic can be added to turn the identity insert on and off in the script.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The next step is to build the WHERE clause of our delete statement. This is done by using the column keys and splitting them out into different predicates. Executing the code down to the&amp;nbsp;@WhereClause creation will produce this output.&amp;nbsp;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@WhereClause = rowguid IN (SELECT rowguid FROM stage.STAGE_SalesOrderHeader) AND SalesOrderNumber IN (SELECT SalesOrderNumber FROM stage.STAGE_SalesOrderHeader) AND SalesOrderID IN (SELECT SalesOrderID FROM stage.STAGE_SalesOrderHeader)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There is a section commented out for handling composite keys that will not evaluate with each column key in their own predicate. In this scenario, the values are concatenated. The commented section for composite keys will show the below result for the same table/key combination.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="applescript"&gt;@WhereClause = CONCAT(rowguid, SalesOrderNumber, SalesOrderID) IN (SELECT CONCAT(rowguid, SalesOrderNumber, SalesOrderID) FROM stage.STAGE_SalesOrderHeader)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Next, the delete and insert statements are created using the dynamic SQL in the script and previous steps. Here are the outputs from our example.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Delete statement&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;DELETE FROM salesLT.SalesOrderHeader WHERE rowguid IN (SELECT rowguid FROM stage.STAGE_SalesOrderHeader) AND SalesOrderNumber IN (SELECT SalesOrderNumber FROM stage.STAGE_SalesOrderHeader) AND SalesOrderID IN (SELECT SalesOrderID FROM stage.STAGE_SalesOrderHeader)&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Insert statement&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;LI-CODE lang="sql"&gt;INSERT INTO salesLT.SalesOrderHeader ([SalesOrderID],[RevisionNumber],[OrderDate],[DueDate],[ShipDate],[Status],[OnlineOrderFlag],[SalesOrderNumber],[PurchaseOrderNumber],[AccountNumber],[CustomerID],[ShipToAddressID],[BillToAddressID],[ShipMethod],[CreditCardApprovalCode],[SubTotal],[TaxAmt],[Freight],[TotalDue],[Comment],[rowguid],[ModifiedDate])  SELECT [SalesOrderID],[RevisionNumber],[OrderDate],[DueDate],[ShipDate],[Status],[OnlineOrderFlag],[SalesOrderNumber],[PurchaseOrderNumber],[AccountNumber],[CustomerID],[ShipToAddressID],[BillToAddressID],[ShipMethod],[CreditCardApprovalCode],[SubTotal],[TaxAmt],[Freight],[TotalDue],[Comment],[rowguid],[ModifiedDate] FROM stage.STAGE_SalesOrderHeader&lt;/LI-CODE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Finally, those statements are passed into&amp;nbsp;&lt;STRONG&gt;sp_executesql&amp;nbsp;&lt;/STRONG&gt;to be executed.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;FONT size="7"&gt;&lt;FONT size="6"&gt;&lt;STRONG&gt;Summary&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;The template and scripts will allow you to build dynamic metadata driven ETL process at enterprise scale with as little as 3 pipelines to facilitate 'N' number of tables. This metadata driven approach is highly flexible and scalable, which will allow you to build upon this solution and even cater it to your exact needs. Even if the requirements or change tracking logic is more complex than waterfall columns or composite keys, there is still an ability to add complex logic into this process to handle your ETL needs.&lt;/P&gt;</description>
      <pubDate>Thu, 28 Sep 2023 14:35:51 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/metadata-driven-pipelines-for-dynamic-full-and-incremental/ba-p/3925362</guid>
      <dc:creator>Marc_Bushong</dc:creator>
      <dc:date>2023-09-28T14:35:51Z</dc:date>
    </item>
    <item>
      <title>Integer Type Available for Pipeline Variables</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/integer-type-available-for-pipeline-variables/ba-p/3902472</link>
      <description>&lt;P&gt;Today, we are announcing the support for Integer type for pipeline variables. This feature is quite self-explanatory: you can define a pipeline variable as integer, and use all the arithmetic functions with it, without converting it back to string type anymore.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;This significantly simplifies the workflow if you are using an&amp;nbsp;&lt;SPAN&gt;iterator within an&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;Until&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;or &lt;/SPAN&gt;&lt;STRONG&gt;ForEach&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;activity.&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN&gt;Please note that in a &lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;Set variable&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;activity, you can't reference the variable being set in the &lt;/SPAN&gt;&lt;EM&gt;value&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;field, i.e.,&amp;nbsp;no self-referencing. To work around this limitation, set a temporary variable and then create a second &lt;/SPAN&gt;&lt;SPAN&gt;&lt;STRONG&gt;Set variable&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;activity. The second &lt;STRONG&gt;Set variable&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;activity sets the value of the iterator to the temporary variable.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;Please be aware that variables are scoped at the pipeline level. This means that they're&lt;STRONG&gt; not thread safe&lt;/STRONG&gt; and may cause unexpected and undesired behavior if they're used along with parallel iteration. Particularly, please be very careful when the value is also being modified within that ForEach activity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;We hope that you found this helpful! Let us know in the comments if you have any questions or feedback!&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 17 Aug 2023 21:10:30 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/integer-type-available-for-pipeline-variables/ba-p/3902472</guid>
      <dc:creator>ChenyeCharlieZhu</dc:creator>
      <dc:date>2023-08-17T21:10:30Z</dc:date>
    </item>
    <item>
      <title>Documentation search now embedded in Azure Data Factory</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/documentation-search-now-embedded-in-azure-data-factory/ba-p/3873890</link>
      <description>&lt;P&gt;In the Data Factory team, we are always looking for ways to make the life of the data engineer as easy as possible!&amp;nbsp; To help with easily and quickly finding answers to your questions in Azure Data Factory (ADF), we've incorporated documentation search to our ADF search bar.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;Without ever leaving your ADF design environment, we'll bring the related documentation to your searches quickly find the answers you are looking for!&lt;/P&gt;</description>
      <pubDate>Thu, 13 Jul 2023 21:40:57 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/documentation-search-now-embedded-in-azure-data-factory/ba-p/3873890</guid>
      <dc:creator>Mark Kromer</dc:creator>
      <dc:date>2023-07-13T21:40:57Z</dc:date>
    </item>
    <item>
      <title>Comment Out Part of Pipeline</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/comment-out-part-of-pipeline/ba-p/3868069</link>
      <description>&lt;P&gt;To kick start the second half of 2023, ADF team has brought you major improvements in pipeline development and authoring experience. Specifically, we now allow you to comment out part of your pipeline, without deleting the definition.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Introducing &lt;STRONG&gt;Deactivating and Reactivating Activities&lt;/STRONG&gt;. Deactivate one or more activities from a pipeline, and we skip them during validation and during pipeline run. And you may choose to reactivate these activities at a later time.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;H2&gt;Behaviors&amp;nbsp;&amp;nbsp;&lt;/H2&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;An inactive activity behaves differently in a pipeline. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;OL&gt;
&lt;LI&gt;&lt;SPAN&gt;On canvas, the inactive activity is grayed out, with &lt;/SPAN&gt;&lt;SPAN&gt;_Inactive sign_&lt;/SPAN&gt;&lt;SPAN&gt; placed next to the activity type.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;On canvas, a status sign (Succeeded, Failed or Skipped) is placed on the box, to visualize the &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Mark activity as&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;setting.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;The activity is excluded from pipeline validation. Hence, you don't need to provide all required fields for an inactive activity.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;During debug run and pipeline run, the activity won't actually execute. Instead, it runs a place holder line item, with the reserved status &lt;/SPAN&gt;&lt;EM&gt;&lt;STRONG&gt;Inactive&lt;/STRONG&gt;&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;The branching option is controlled by &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Mark activity as&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;option. In other words:&lt;/SPAN&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;if you mark the activity as &lt;/SPAN&gt;&lt;EM&gt;Succeeded&lt;/EM&gt;&lt;SPAN&gt;, the &lt;/SPAN&gt;&lt;EM&gt;UponSuccess&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;or &lt;/SPAN&gt;&lt;EM&gt;UponCompletion&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;branch runs.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt; if you mark the activity as &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Failed&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, the &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN&gt;UponFailure&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;or &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN&gt;UponCompletion&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;branch runs&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;if you mark the activity as &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Skipped&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, the &lt;/SPAN&gt;&lt;EM&gt;UponSkip&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;branch runs&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/LI&gt;
&lt;/OL&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;An inactive activity never actually runs. This means the activity won't have an error field, or its typical output fields. Any references to missing fields will throw errors downstream.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Set Up&lt;/H2&gt;
&lt;P&gt;There are 2 ways to deactivate an activity.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;First, you may deactivate a single activity from its &lt;/SPAN&gt;&lt;STRONG&gt;General&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;tab. &lt;/SPAN&gt;&lt;/DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;Select the activity you want to deactivate&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;Under &lt;/SPAN&gt;&lt;STRONG&gt;&lt;SPAN&gt;General&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;SPAN&gt; tab, select &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN&gt;Inactive&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;for &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Activity state&lt;/EM&gt;&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;Pick a state for &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Mark activity as&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;. Choose from &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Succeeded&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, &lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Failed&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;or &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN&gt;Skipped&lt;/SPAN&gt;&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;&lt;SPAN&gt;&lt;img /&gt;&lt;/SPAN&gt;&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Alternatively, you&amp;nbsp;&lt;/SPAN&gt;can deactivate multiple activities with right click.&lt;/P&gt;
&lt;DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;Press down &lt;/SPAN&gt;&lt;EM&gt;Ctrl&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;key to multi-select. Using your mouse, left click on all activities you want to&amp;nbsp;&lt;/SPAN&gt;deactivate.&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;Right click to bring up the drop down&amp;nbsp;&lt;/SPAN&gt;menu.&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;Select &lt;/SPAN&gt;&lt;EM&gt;&lt;SPAN&gt;Deactivate&lt;/SPAN&gt;&lt;/EM&gt;&lt;SPAN&gt;&amp;nbsp;to deactivate them&amp;nbsp;&lt;/SPAN&gt;all.&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;To fine tune the settings for&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&lt;EM&gt;Mark activity as&lt;/EM&gt;&lt;/SPAN&gt;&lt;SPAN&gt;, go to &lt;/SPAN&gt;&lt;STRONG&gt;General&lt;/STRONG&gt;&lt;SPAN&gt;&amp;nbsp;tab of the activity, and make appropriate&amp;nbsp;&lt;/SPAN&gt;changes.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;In both cases, you do need to deploy the changes to deactivate the parts during pipeline run.&lt;/P&gt;
&lt;H2&gt;Use Cases&lt;/H2&gt;
&lt;/DIV&gt;
&lt;P&gt;Deactivation is a powerful tool for pipeline developer. It allows developers to "comment out" part of the code, without permanently deleting the activities. It shines in following scenarios:&lt;/P&gt;
&lt;DIV&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;STRONG&gt;When developing a pipeline&lt;/STRONG&gt;, developer can add place holder inactive activities before filling all the required fields. For instance, I need a Copy activity from SQL Server to Data warehouse, but I haven't set up all the connections yet. So I use an &lt;/SPAN&gt;&lt;SPAN&gt;_inactive_&lt;/SPAN&gt;&lt;SPAN&gt; copy activity as the place holder for iterative development process.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;&lt;STRONG&gt;After deployment&lt;/STRONG&gt;, developer can comment out certain activities that are constantly causing troubles to avoid costly retries. For instance, my on-premises SQL server is having network connection issues, and I know my copy activities fail for certain. I may want to deactivate the copy activity, to avoid retry requests from flooding the brittle system.&lt;/SPAN&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/DIV&gt;</description>
      <pubDate>Fri, 07 Jul 2023 20:46:44 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/comment-out-part-of-pipeline/ba-p/3868069</guid>
      <dc:creator>ChenyeCharlieZhu</dc:creator>
      <dc:date>2023-07-07T20:46:44Z</dc:date>
    </item>
    <item>
      <title>Continued region expansion: Azure Data Factory just became generally available in Sweden Central</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-just-became/ba-p/3857249</link>
      <description>&lt;DIV&gt;&lt;SPAN&gt;Azure Data Factory is now available in &lt;STRONG&gt;Sweden Central&lt;/STRONG&gt;.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;&lt;SPAN&gt;&lt;SPAN&gt;You can now provision Data Factory in the new region in order to co-locate your Extract-Transform-Load logic,&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;if you are utilizing the region for storing and managing your modern data warehouse.
&lt;P style="margin: 0in; font-family: Calibri; font-size: 10.5pt; color: #242424;" lang="en-US"&gt;&amp;nbsp;&lt;/P&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;See the full set of&amp;nbsp;&lt;A title="Azure Data Factory supported regions" href="https://azure.microsoft.com/en-us/explore/global-infrastructure/products-by-region/?products=data-factory" target="_self"&gt;Azure Data Factory supported regions&lt;/A&gt;.&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;</description>
      <pubDate>Fri, 30 Jun 2023 05:37:06 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/continued-region-expansion-azure-data-factory-just-became/ba-p/3857249</guid>
      <dc:creator>Chunhua</dc:creator>
      <dc:date>2023-06-30T05:37:06Z</dc:date>
    </item>
    <item>
      <title>Securing outbound traffic with Azure Data Factory's outbound network rules</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/securing-outbound-traffic-with-azure-data-factory-s-outbound/ba-p/3844032</link>
      <description>&lt;P&gt;Data security is paramount in today's digital world. With an increasing number of cyber threats, organizations are always on the lookout for robust solutions to enhance their security posture. In this blog, we delve into a critical feature provided by Azure Data Factory – Outbound Rules – that allows users to control and restrict outbound traffic to specific Fully Qualified Domain Names (FQDN).&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Understanding Outbound Allow listing in Azure Data Factory&lt;/H2&gt;
&lt;P&gt;Outbound allow listing of FQDN is a network security practice that allows organizations to control outbound traffic from their networks to specific, approved domain names. Outbound rules in Azure Data Factory apply to pipeline activities, such as Copy, Dataflows, Web, Webhook, and Azure Function activities and authoring scenarios like data preview and test connection.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: &lt;/EM&gt;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;EM&gt;This feature is in &lt;U&gt;Preview&lt;/U&gt;. &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;SSIS Integration runtime and Managed Airflow Integration runtime currently do not support the outbound rules. &lt;/EM&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;EM&gt;This feature is independent of Managed VNet and applies to all supported activities running on SHIR, Azure IR (including AutoResolve IR), and Azure IR in Managed VNet. However, we suggest using Managed VNet for higher levels of compute isolation in conjunction with outbound allowlist capability to prevent data exfiltration.&lt;/EM&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;These rules help organizations create a secure and exfiltration-proof data integration solution. What's more, &lt;A href="https://learn.microsoft.com/en-us/azure/governance/policy/overview" target="_blank" rel="noopener"&gt;Azure Policy&lt;/A&gt; enforces these rules, thereby boosting governance.&lt;/P&gt;
&lt;P&gt;As it uses Azure Policy, these outbound rules can be enforced at different management levels based on the organization’s needs.&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/governance/management-groups/overview" target="_blank" rel="noopener"&gt;Management Group&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;Subscription&lt;/LI&gt;
&lt;LI&gt;Resource Group&lt;/LI&gt;
&lt;LI&gt;Resource (UI within Data Factory for this assignment is coming soon, but you can use REST API/ SDK to achieve this today)&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;EM&gt;&lt;STRONG&gt;Note&lt;/STRONG&gt;: While in preview, the compliance for this policy is not reported&lt;/EM&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H2&gt;Steps to enable Azure Policy for outbound rules&lt;/H2&gt;
&lt;OL&gt;
&lt;LI&gt;Assign the outbound &lt;A href="https://portal.azure.com/#view/Microsoft_Azure_Policy/PolicyDetailBlade/definitionId/%2Fproviders%2FMicrosoft.Authorization%2FpolicyDefinitions%2F3d02a511-74e5-4dab-a5fd-878704d4a61a" target="_blank" rel="noopener"&gt;Policy&lt;/A&gt; with the desired scope.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;Configure the parameters of the policy specifying the allowed domain names. Create the policy.&lt;BR /&gt;Note: Regex is not supported hence the domains should exactly be the same as used in the linked services. To update the outbound url list, please update the policy parameter.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="3"&gt;
&lt;LI&gt;Enable the feature in ADF studio. &lt;BR /&gt;&lt;img /&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;The Outbound Rules feature in Azure Data Factory allows organizations to exercise granular control over outbound traffic, thereby strengthening network security during data integration. By integrating with Azure Policy, this feature also improves overall governance.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Resources:&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/configure-outbound-allow-list-azure-policy" target="_blank" rel="noopener"&gt;Outbound allow list documentation&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://learn.microsoft.com/en-us/azure/governance/policy/overview" target="_blank" rel="noopener"&gt;Azure Policy Overview&lt;/A&gt;&lt;/LI&gt;
&lt;LI&gt;&lt;A href="https://portal.azure.com/#view/Microsoft_Azure_Policy/PolicyDetailBlade/definitionId/%2Fproviders%2FMicrosoft.Authorization%2FpolicyDefinitions%2F3d02a511-74e5-4dab-a5fd-878704d4a61a" target="_blank" rel="noopener"&gt;New Azure Policy for outbound allow listing in ADF&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;SPAN&gt;If you have any questions or feedback, please post them in the comments below.&amp;nbsp;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Mon, 12 Jun 2023 19:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/securing-outbound-traffic-with-azure-data-factory-s-outbound/ba-p/3844032</guid>
      <dc:creator>Abhishek Narain</dc:creator>
      <dc:date>2023-06-12T19:00:00Z</dc:date>
    </item>
    <item>
      <title>Introducing optional Source settings for DelimitedText and JSON sources for top-level CDC resource</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/introducing-optional-source-settings-for-delimitedtext-and-json/ba-p/3824274</link>
      <description>&lt;P&gt;In January, we announced the &lt;A href="https://techcommunity.microsoft.com/t5/azure-data-factory-blog/announcing-the-public-preview-of-a-new-top-level-cdc-resource-in/ba-p/3720519" target="_blank" rel="noopener"&gt;public preview of top-level CDC resource&lt;/A&gt; in ADF and followed up with &lt;A href="https://techcommunity.microsoft.com/t5/azure-data-factory-blog/process-your-data-in-seconds-with-new-adf-real-time-cdc/ba-p/3759131" target="_blank" rel="noopener"&gt;real-time latency support&lt;/A&gt; for top-level CDC resource around March. Based on your feedback, we are now enabling additional source configurations for Delimited Text sources and JSON sources, which can be set optionally within a top-level CDC resource in ADF.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Previously for Delimited Text sources, we provided support for Comma as the only Column delimiter. Now when you select Delimited Text source for your CDC resource, you can set advanced source configurations which includes the selection of Compression type, Encoding, Column delimiter, Row Delimiter, Quote character, Escape character, and First row as header.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;For JSON sources, previously the default document type was set to Document per line but now we have included support for Single document, Document per line, and Array of documents as document types. Additional settings for Unquoted column name, Has comments, Single quoted, and Backslash escaped have been added as well.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;U&gt;&lt;STRONG&gt;NOTE:&lt;/STRONG&gt;&lt;/U&gt; These source settings are optional for selection and if not manually edited, they are set to the default values.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;As we continue to add more features within top-level ADF CDC, we hope these optional source settings for DelimitedText and JSON sources help. Please continue to share your feedback in the comments!&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 02 Jun 2023 13:00:00 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/introducing-optional-source-settings-for-delimitedtext-and-json/ba-p/3824274</guid>
      <dc:creator>Krishnakumar_Rukmangathan</dc:creator>
      <dc:date>2023-06-02T13:00:00Z</dc:date>
    </item>
    <item>
      <title>Unroll multiple arrays in a single Flatten step in ADF</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/unroll-multiple-arrays-in-a-single-flatten-step-in-adf/ba-p/3802457</link>
      <description>&lt;P&gt;You can now easily unroll multiple arrays inside a single Flatten transformation in Azure Data Factory and Azure Synapse Analytics using a data pipeline with a Mapping Data Flow.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ADF and Synapse data flows gave a &lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/data-flow-flatten" target="_self"&gt;Flatten transformation&lt;/A&gt; to make it easy to unroll an array as part of your data transformation pipelines. We've updated the Flatten transformation to now allow for multiple arrays that can be unrolled in a single transformation step. This will make your ETL jobs much simpler with fewer transformation steps.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;There is now a plus (+) next to the Unroll Array property where you can add more arrays to your list to unroll. You can also use ADF's meta functions like name and type to find arrays to unroll in your data using patterns. The resulting data will be joined together as a single result set as shown below.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Fri, 21 Apr 2023 19:48:31 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/unroll-multiple-arrays-in-a-single-flatten-step-in-adf/ba-p/3802457</guid>
      <dc:creator>Mark Kromer</dc:creator>
      <dc:date>2023-04-21T19:48:31Z</dc:date>
    </item>
    <item>
      <title>ADF private DNS zone overrides ARM DNS resolution causing ‘Not found’ error.</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/adf-private-dns-zone-overrides-arm-dns-resolution-causing-not/ba-p/3799421</link>
      <description>&lt;P&gt;##Steps to Migrate:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Navigate to existing Private DNS zone privatelink.adf.azure.com&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Go to portal.azure.com&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Type ‘private DNS zones’ on the search bar and click on the option&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Click on the privatelink.adf.azure.com private zone&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="2"&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Get the private IP of the existing private endpoint and delete the private zone&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; In the overview blade (default) you’ll see a table with the DNS records&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Look for the one with the name ‘adf’ with Type ‘A’ and write down the IP under ‘Value’ for the next steps.&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Click on ‘Virtual network links on the left panel, write down all the Virtual Networks for the next steps and then delete all the virtual network links&lt;/LI&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Go back go ‘overview’ and delete a private zone&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;3.&amp;nbsp; &amp;nbsp;Create a new Private DNS zone with the name ‘privatelink.adf.azure.com&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 1.In the main Private DNS zones page, click on ‘add’ on the toolbar&lt;/P&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; 2.&amp;nbsp; Select the subscription and resource group and add ‘privatelink.adf.azure.com’ as the name&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;&amp;nbsp;Add Virtual network links and DNS ‘A’ record&amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; 1. &amp;nbsp;In the privatelink.adf.azure.com private zone click on ‘Virtual network links’ on the left panel and then add a network link for each of the virtual networks from step 2c&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Add DNS ‘A’ record&lt;/LI&gt;
&lt;/OL&gt;
&lt;UL&gt;
&lt;LI&gt;&amp;nbsp; Go back to the overview panel and click on ‘+ Record set’, type ‘adf’ as the name, TTL: 10, TTL unit: seconds, and type the IP form step 2b&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 19 Apr 2023 19:36:38 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/adf-private-dns-zone-overrides-arm-dns-resolution-causing-not/ba-p/3799421</guid>
      <dc:creator>Sachin215</dc:creator>
      <dc:date>2023-04-19T19:36:38Z</dc:date>
    </item>
    <item>
      <title>Trigger ADF pipeline using Storage event trigger over private network.</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/trigger-adf-pipeline-using-storage-event-trigger-over-private/ba-p/3799326</link>
      <description>&lt;P&gt;Project Technology: Azure function, ADF, Azure Synapse, ADLS&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Issue description: Customer has a strict regulatory compliance requirement, due to which they need to block all outbound (public endpoint) connections. Hence, most of our products were not able to provide the expected result as we have a dependency on public endpoints.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Summary:&lt;/P&gt;
&lt;OL&gt;
&lt;LI&gt;The customer was not able to download PowerShell modules from PowerShell gallery in the Azure function due to outbound restrictions. However, we gave a suggestion to manually download and upload the files to Azure function via VS-Code. However, it did not work either.&lt;/LI&gt;
&lt;LI&gt;As a result, we used PowerShell command line from user desktop instead of using VS-Code.&lt;/LI&gt;
&lt;LI&gt;Now when we tried to access the ADF from Azure function, Boom! It failed.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="4"&gt;
&lt;LI&gt;To validate the access token, we executed MSI validator and came with the below error.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;OL start="5"&gt;
&lt;LI&gt;Reason for all these errors was, AZ PowerShell was trying to connect to management.azure.com in order to get the Oauth2 token. However, as per the bank’s regulations, access to any public endpoints was not allowed which basically stalled the project.&lt;/LI&gt;
&lt;LI&gt;To get around this and access the storage behind the firewall/private endpoints/Private links, we proposed a solution to use Managed identity and REST API which enabled the function to grab bearer token without public endpoint access and REAST API was able to use that bearer token to access Azure storage.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Code if customer is using system assigned managed identity. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;$resourceURI = "&lt;A href="https://functeststorageacc01.queue.core.windows.net/" target="_blank" rel="noopener"&gt;https://functeststorageacc01.queue.core.windows.net/&lt;/A&gt;"&lt;/P&gt;
&lt;P&gt;$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&amp;amp;api-version=2019-08-01"&lt;/P&gt;
&lt;P&gt;$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI&lt;/P&gt;
&lt;P&gt;$accessToken = $tokenResponse.access_token&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Code if customer is using user assigned managed identity. &lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;$resourceURI = "&lt;A href="https://functeststorageacc01.queue.core.windows.net/" target="_blank" rel="noopener"&gt;https://functeststorageacc01.queue.core.windows.net/&lt;/A&gt;"&lt;/P&gt;
&lt;P&gt;$tokenAuthURI = $env:IDENTITY_ENDPOINT + "?resource=$resourceURI&amp;amp;api-version=2019-08-01&amp;amp;client_id=$env:AZURE_CLIENT_ID"&lt;/P&gt;
&lt;P&gt;$tokenResponse = Invoke-RestMethod -Method Get -Headers @{"X-IDENTITY-HEADER"="$env:IDENTITY_HEADER"} -Uri $tokenAuthURI&lt;/P&gt;
&lt;P&gt;$accessToken = $tokenResponse.access_token&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;Code to use bearer token to access Azure storage.&lt;/STRONG&gt;&lt;/P&gt;
&lt;P&gt;$version&amp;nbsp;=&amp;nbsp;"2017-11-09"&lt;BR /&gt;$header&amp;nbsp;=&amp;nbsp;@{&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Authorization&amp;nbsp;=&amp;nbsp;"Bearer&amp;nbsp;$accessToken"&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;'x-ms-version'&amp;nbsp;=&amp;nbsp;$version&lt;BR /&gt;}&lt;BR /&gt;&lt;BR /&gt;[Net.ServicePointManager]::SecurityProtocol&amp;nbsp;=&amp;nbsp;[Net.SecurityProtocolType]::Tls12&lt;BR /&gt;&lt;BR /&gt;$QueueMessage&amp;nbsp;=&amp;nbsp;"This&amp;nbsp;is&amp;nbsp;test&amp;nbsp;message#1&amp;nbsp;"&lt;BR /&gt;$body&amp;nbsp;=&amp;nbsp;"&amp;lt;QueueMessage&amp;gt;&amp;lt;MessageText&amp;gt;$QueueMessage&amp;lt;/MessageText&amp;gt;&amp;lt;/QueueMessage&amp;gt;"&lt;BR /&gt;$item&amp;nbsp;=&amp;nbsp;Invoke-RestMethod&amp;nbsp;-Method&amp;nbsp;POST&amp;nbsp;-Uri&amp;nbsp;&lt;A href="https://nam06.safelinks.protection.outlook.com/?url=https%3A%2F%2Furldefense.com%2Fv3%2F__https%3A%2Fstorazaarfdevbtgt00003.queue.core.windows.net%2Ftest2%2Fmessages__%3B!!I2XIyG2ANlwasLbx!Ut73YqVGwRj1EC0dKOs8MNK9M0L6uKWDw-DtoDwiIQOLb-cfmcnsZoMgxfzZu1L5zgKKTtxWVDl-90sTkb8f2g9AgCzyjuPD%24&amp;amp;data=05%7C01%7CCHIDAMBAR.SARAF%40microsoft.com%7Cd9feda15cdb64d2a331108dabdb5b5b9%7C72f988bf86f141af91ab2d7cd011db47%7C1%7C0%7C638030885436180893%7CUnknown%7CTWFpbGZsb3d8eyJWIjoiMC4wLjAwMDAiLCJQIjoiV2luMzIiLCJBTiI6Ik1haWwiLCJXVCI6Mn0%3D%7C3000%7C%7C%7C&amp;amp;sdata=DMTKkB8lsT9Gd147O12nz6QJupjb9QixQ%2FOhEDW%2Fp00%3D&amp;amp;reserved=0" target="_blank" rel="noopener"&gt;https://storazaarfdevbtgt00003.queue.core.windows.net/test2/messages&lt;/A&gt;&amp;nbsp;-Headers&amp;nbsp;$header&amp;nbsp;-Body&amp;nbsp;$body&amp;nbsp;-ContentType&amp;nbsp;"application/json"&lt;/P&gt;
&lt;OL start="7"&gt;
&lt;LI&gt;Even though we had the bearer token and we were using REST API but still we were not able to trigger the ADF pipeline because in order to perform any operations using REST API to ADF would require access to Azure management plane (management.azure.com) which is not allowed in the bank’s environment.&lt;/LI&gt;
&lt;LI&gt;Here we proposed a solution to trigger the ADF pipeline through storage event trigger using managed private endpoints, so ADF was able to read the storage over the private endpoints without needing to go out to public endpoints.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;9.After creating all the above steps we were able to trigger the ADF using Storage Event.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;Co-Author: Umesh Panwar (Apps &amp;amp; Infra CSA)&lt;/P&gt;</description>
      <pubDate>Mon, 24 Apr 2023 13:30:19 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/trigger-adf-pipeline-using-storage-event-trigger-over-private/ba-p/3799326</guid>
      <dc:creator>Sachin215</dc:creator>
      <dc:date>2023-04-24T13:30:19Z</dc:date>
    </item>
    <item>
      <title>Pipeline Logic 3: Error Handling and Try Catch</title>
      <link>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/pipeline-logic-3-error-handling-and-try-catch/ba-p/3787601</link>
      <description>&lt;H2 id="toc-hId-531300142"&gt;&lt;SPAN&gt;Series Overview&lt;/SPAN&gt;&lt;/H2&gt;
&lt;P&gt;&lt;SPAN&gt;Orchestration allows conditional logic and enables users to take different paths based upon outcomes of a previous activity.&amp;nbsp;Building upon the concepts of conditional paths, ADF and Synapse Pipelines allow users to build&amp;nbsp;&lt;STRONG&gt;versatile&lt;/STRONG&gt;&amp;nbsp;and&amp;nbsp;&lt;STRONG&gt;resilient&amp;nbsp;&lt;/STRONG&gt;workflows&amp;nbsp;that can handle unexpected errors that work smoothly in auto-pilot mode.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;This is an ongoing series that gradually levels up and helps you build even more complicated logic to handle more scenarios. We will walk through examples for some common use cases, and help you to build functional and useful workflows.&lt;/SPAN&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;SPAN&gt;Please review the first installment in the series:&amp;nbsp;&lt;/SPAN&gt;&lt;A href="https://techcommunity.microsoft.com/t5/azure-data-factory-blog/pipeline-logic-1-error-handling-and-best-effort-step/ba-p/3712168" target="_blank" rel="noopener"&gt;Part 1: Error Handling and Best Effort Step&lt;/A&gt;&amp;nbsp;and &lt;A href="https://techcommunity.microsoft.com/t5/azure-data-factory-blog/pipeline-logic-2-or-at-least-1-activity-succeeded-or-failed/ba-p/3712193" target="_self"&gt;Part 2: OR&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;H3&gt;Error Handling and Try Catch&lt;/H3&gt;
&lt;P&gt;Error handling is a very common scenario in data engineering pipelines. From time to time, activities will fail, but we don't want to fail the whole pipeline due to a single activity failure.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We call this logic: &lt;STRONG&gt;Try-Catch,&lt;/STRONG&gt; and we have streamlined the implementation for this common use case.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&lt;img /&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;&lt;SPAN&gt;Add first&amp;nbsp;&lt;/SPAN&gt;activity&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Add error handling to the UponFailure path&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;LI&gt;&lt;SPAN&gt;A&lt;/SPAN&gt;dd second activity, but don't connect to the first activity&lt;/LI&gt;
&lt;LI&gt;
&lt;DIV&gt;
&lt;DIV&gt;&lt;SPAN&gt;Connect both UponFailure and UponSkip paths from the error handling activity to the second activity.&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&lt;/DIV&gt;
&lt;/DIV&gt;
&lt;/LI&gt;
&lt;/UL&gt;
&lt;P&gt;To learn more, read&amp;nbsp;&lt;A href="https://learn.microsoft.com/en-us/azure/data-factory/tutorial-pipeline-failure-error-handling#try-catch-block" target="_blank"&gt;Pipeline failure and error message - Azure Data Factory | Microsoft Learn&lt;/A&gt;.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;We hope that you have found this blog to be helpful! If you have any questions or feedback, please post them in the comments below.&amp;nbsp;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 05 Apr 2023 17:20:16 GMT</pubDate>
      <guid>https://techcommunity.microsoft.com/t5/azure-data-factory-blog/pipeline-logic-3-error-handling-and-try-catch/ba-p/3787601</guid>
      <dc:creator>ChenyeCharlieZhu</dc:creator>
      <dc:date>2023-04-05T17:20:16Z</dc:date>
    </item>
  </channel>
</rss>

