From 027a587790a690d9e9de714bdcdabe99ecc6f95b Mon Sep 17 00:00:00 2001 From: Slava T <4713633+slavat@users.noreply.github.com> Date: Fri, 2 Dec 2022 00:30:46 -0500 Subject: [PATCH] Adding a community template for syncing Dataverse data to Azure SQL DB (by extending Synapse Link for Dataverse) Adding a community template and related documentation for syncing Dataverse data to Azure SQL DB (by extending Synapse Link for Dataverse). --- .../Sync Dataverse to Azure SQL DB.json | 1 + .../DataverseToAzureSQLDB/manifest.json | 48 ++++++ .../DataverseToAzureSQLDB.md | 160 ++++++++++++++++++ .../Images/ConfigureLinkedServices-detail.png | Bin 0 -> 29385 bytes .../Images/ConfigureLinkedServices.png | Bin 0 -> 25153 bytes .../Images/ImportPipelineFromTemplate.png | Bin 0 -> 25647 bytes .../Images/ImportedPipelines.png | Bin 0 -> 29299 bytes .../Images/MonitorPipelineRuns.png | Bin 0 -> 82597 bytes .../Images/SolutionArchitecture.png | Bin 0 -> 93302 bytes .../Images/TriggerNow.png | Bin 0 -> 31703 bytes 10 files changed, 209 insertions(+) create mode 100644 community templates/DataverseToAzureSQLDB/Sync Dataverse to Azure SQL DB.json create mode 100644 community templates/DataverseToAzureSQLDB/manifest.json create mode 100644 community templates/documentation/DataverseToAzureSQLDB/DataverseToAzureSQLDB.md create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/ConfigureLinkedServices-detail.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/ConfigureLinkedServices.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/ImportPipelineFromTemplate.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/ImportedPipelines.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/MonitorPipelineRuns.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/SolutionArchitecture.png create mode 100644 community templates/documentation/DataverseToAzureSQLDB/Images/TriggerNow.png diff --git a/community templates/DataverseToAzureSQLDB/Sync Dataverse to Azure SQL DB.json b/community templates/DataverseToAzureSQLDB/Sync Dataverse to Azure SQL DB.json new file mode 100644 index 00000000..c64fca81 --- /dev/null +++ b/community templates/DataverseToAzureSQLDB/Sync Dataverse to Azure SQL DB.json @@ -0,0 +1 @@ +{"$schema":"http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#","contentVersion":"1.0.0.0","parameters":{"workspaceName":{"type":"string","metadata":"Workspace name","defaultValue":"sawstx"},"DestinationSQLDB":{"type":"string"},"SourceSynapseServerlessDB":{"type":"string"}},"variables":{"workspaceId":"[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"},"resources":[{"name":"[concat(parameters('workspaceName'), '/Sync Orchestration')]","type":"Microsoft.Synapse/workspaces/pipelines","apiVersion":"2019-06-01-preview","properties":{"description":"Main pipeline that orchestrates the synchronization process and calls other pipelines as needed.","activities":[{"name":"Get tables to process","description":"Get a list of tables that need to be synchronized from a control table.","type":"Lookup","dependsOn":[{"activity":"Auto-Populate List of Tables to Sync","dependencyConditions":["Succeeded"]}],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"source":{"type":"AzureSqlSource","sqlReaderStoredProcedureName":"[[orchestration].[GetTablesToProcess]","storedProcedureParameters":{"TableGroup":{"type":"Int16","value":{"value":"@pipeline().parameters.TableGroupToSync","type":"Expression"}}},"queryTimeout":"02:00:00","partitionOption":"None"},"dataset":{"referenceName":"DataverseSQLDB","type":"DatasetReference","parameters":{"SchemaName":"n/a","TableName":"n/a"}},"firstRowOnly":false}},{"name":"For each table","description":"Determine whether to perform a full or an incremental copy and execute an appropriate child pipeline.","type":"ForEach","dependsOn":[{"activity":"Get tables to process","dependencyConditions":["Succeeded"]}],"userProperties":[],"typeProperties":{"items":{"value":"@activity('Get tables to process').output.value","type":"Expression"},"isSequential":false,"activities":[{"name":"Separate Full Copy from Incremental Copy Tables","type":"IfCondition","dependsOn":[{"activity":"Execute Schema Drift Handler","dependencyConditions":["Succeeded"]}],"userProperties":[],"typeProperties":{"expression":{"value":"@item().IsIncremental","type":"Expression"},"ifFalseActivities":[{"name":"Execute Full Copy Pipeline","type":"ExecutePipeline","dependsOn":[],"userProperties":[],"typeProperties":{"pipeline":{"referenceName":"Table Full Copy","type":"PipelineReference"},"waitOnCompletion":true,"parameters":{"SourceSchema":{"value":"@item().SourceSchema","type":"Expression"},"SourceTable":{"value":"@item().SourceTable","type":"Expression"},"TargetSchema":{"value":"@item().TargetSchema","type":"Expression"},"TargetTable":{"value":"@item().TargetTable","type":"Expression"},"TableId":{"value":"@item().TableId","type":"Expression"},"KeyColumns":{"value":"@item().KeyColumns","type":"Expression"}}}}],"ifTrueActivities":[{"name":"Execute Incremental Copy Pipeline","type":"ExecutePipeline","dependsOn":[],"userProperties":[],"typeProperties":{"pipeline":{"referenceName":"Table Incremental Copy","type":"PipelineReference"},"waitOnCompletion":true,"parameters":{"SourceSchema":{"value":"@item().SourceSchema","type":"Expression"},"SourceTable":{"value":"@item().SourceTable","type":"Expression"},"TargetSchema":{"value":"@item().TargetSchema","type":"Expression"},"TargetTable":{"value":"@item().TargetTable","type":"Expression"},"LowWatermark":{"value":"@item().LowWatermark","type":"Expression"},"HighWatermark":{"value":"@item().HighWatermark","type":"Expression"},"KeyColumn":{"value":"@item().KeyColumns","type":"Expression"},"TableId":{"value":"@item().TableId","type":"Expression"},"GeneratePrimaryKey":{"value":"@and(pipeline().parameters.AutoGeneratePrimaryKeys, item().NeedsPrimaryKey)","type":"Expression"}}}}]}},{"name":"Execute Schema Drift Handler","type":"ExecutePipeline","dependsOn":[],"userProperties":[],"typeProperties":{"pipeline":{"referenceName":"Handle Schema Drift","type":"PipelineReference"},"waitOnCompletion":true,"parameters":{"SourceSchema":{"value":"@item().SourceSchema","type":"Expression"},"SourceTable":{"value":"@item().SourceTable","type":"Expression"},"TargetSchema":{"value":"@item().TargetSchema","type":"Expression"},"TargetTable":{"value":"@item().TargetTable","type":"Expression"}}}},{"name":"Add a primary key to the target table","description":"If requested and necessary, add a primary key to the target table.","type":"IfCondition","dependsOn":[{"activity":"Separate Full Copy from Incremental Copy Tables","dependencyConditions":["Succeeded"]}],"userProperties":[],"typeProperties":{"expression":{"value":"@and(pipeline().parameters.AutoGeneratePrimaryKeys, item().NeedsPrimaryKey)","type":"Expression"},"ifTrueActivities":[{"name":"Generate Primary Key","type":"SqlServerStoredProcedure","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"storedProcedureName":"[[orchestration].[GeneratePrimaryKey]","storedProcedureParameters":{"KeyColumns":{"value":{"value":"@item().KeyColumns","type":"Expression"},"type":"String"},"Schema":{"value":{"value":"@item().TargetSchema","type":"Expression"},"type":"String"},"Table":{"value":{"value":"@item().TargetTable","type":"Expression"},"type":"String"}}},"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"}}]}}]}},{"name":"Auto-Populate List of Tables to Sync","description":"Check pipeline parameter setting to determine whether to auto-populate list of tables to sync.","type":"IfCondition","dependsOn":[{"activity":"Add orchestration objects to target DB","dependencyConditions":["Succeeded"]}],"userProperties":[],"typeProperties":{"expression":{"value":"@pipeline().parameters.AutoPopulateListOfTablesToSync","type":"Expression"},"ifTrueActivities":[{"name":"Populate List of Tables to Sync","type":"ExecutePipeline","dependsOn":[],"userProperties":[],"typeProperties":{"pipeline":{"referenceName":"Populate List of Tables to Sync","type":"PipelineReference"},"waitOnCompletion":true,"parameters":{"UsePartitionedTables":{"value":"@pipeline().parameters.UsePartitionedTables","type":"Expression"},"TargetSchema":{"value":"@pipeline().parameters.DefaultTargetSchema","type":"Expression"}}}}]}},{"name":"Add orchestration objects to target DB","description":"Add helper objects to the target database","type":"Script","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"},"typeProperties":{"scripts":[{"type":"Query","text":"/****** Object: Schema [orchestration] ******/\nIF NOT EXISTS (SELECT name FROM sys.schemas WHERE name = N'orchestration')\nEXEC sp_executesql @stmt = N'CREATE SCHEMA [orchestration]'\n\n/****** Object: Schema [staging] ******/\nIF NOT EXISTS (SELECT name FROM sys.schemas WHERE name = N'staging')\nEXEC sp_executesql @stmt = N'CREATE SCHEMA [staging]'\n\n/****** Object: Table [orchestration].[ProcessingControl] ******/\nIF OBJECT_ID('[orchestration].[ProcessingControl]', 'U') IS NULL\nEXEC sp_executesql @stmt = N'\nCREATE TABLE [orchestration].[ProcessingControl](\n\t[TableId] [int] IDENTITY(1,1) NOT NULL,\n\t[SourceSchema] [nvarchar](128) NOT NULL,\n\t[SourceTable] [nvarchar](128) NOT NULL,\n\t[TargetSchema] [nvarchar](128) NOT NULL,\n\t[TargetTable] [nvarchar](128) NOT NULL,\n\t[KeyColumns] [nvarchar](4000) NULL,\n\t[IsIncremental] [bit] NOT NULL,\n\t[TableGroup] [smallint] NOT NULL DEFAULT (1),\n\t[IsEnabled] [bit] NOT NULL DEFAULT (1)\n CONSTRAINT [PK_ProcessingControl] PRIMARY KEY CLUSTERED \n(\n\t[TableId] ASC\n)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n) ON [PRIMARY]\n'\n/****** Object: Table [orchestration].[ProcessingLog] ******/\nIF OBJECT_ID('[orchestration].[ProcessingLog]', 'U') IS NULL\nEXEC sp_executesql @stmt = N'\nCREATE TABLE [orchestration].[ProcessingLog](\n\t[TableId] [int] NOT NULL,\n\t[PipelineRunId] [varchar](50) NOT NULL,\n\t[ProcessingStarted] [datetime2](7) NOT NULL,\n\t[ProcessingEnded] [datetime2](7) NULL,\n\t[LowWatermark] [datetime2](7) NULL,\n\t[HighWatermark] [datetime2](7) NULL,\n\t[RowsCopied] int NULL,\n\t[IsSuccessful] bit NULL\n CONSTRAINT [PK_ProcessingLog_1] PRIMARY KEY CLUSTERED \n(\n\t[TableId] ASC,\n\t[PipelineRunId] ASC\n)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n) ON [PRIMARY]\n\nCREATE UNIQUE NONCLUSTERED INDEX [IX_ProcessingControl_TableNames] ON [orchestration].[ProcessingControl]\n(\n\t[SourceSchema] ASC,\n\t[SourceTable] ASC\n)WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]\n'\n\n/****** Object: StoredProcedure [orchestration].[GetTablesToProcess] ******/\nIF OBJECT_ID('[orchestration].[GetTablesToProcess]', 'P') IS NULL\nEXEC sp_executesql @stmt = N'\nCREATE PROCEDURE [orchestration].[GetTablesToProcess]\n\t@TableGroup smallint\n\nAS\n\nSELECT PC.TableId,\n\tPC.SourceSchema,\n\tPC.SourceTable,\n\tPC.TargetSchema,\n\tPC.TargetTable,\n\tPC.KeyColumns,\n\tISNULL(PC.IsIncremental, 0) AS IsIncremental,\n\tISNULL(MAX(PL.HighWatermark), ''1900-01-01'') AS LowWatermark,\n\tGETUTCDATE() AS HighWatermark,\n\tCAST(CASE WHEN PC.IsIncremental = 1 AND PK.CONSTRAINT_NAME IS NULL THEN 1 ELSE 0 END AS BIT) AS NeedsPrimaryKey\nFROM orchestration.ProcessingControl PC\n\tLEFT OUTER JOIN orchestration.ProcessingLog PL\n\t\tON PC.TableId= PL.TableId\n\t\tAND PL.ProcessingEnded IS NOT NULL\n\t\tAND PL.IsSuccessful = 1\n\tLEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS PK\n\t\tON PC.TargetSchema = PK.TABLE_SCHEMA\n\t\tAND PC.TargetTable = PK.TABLE_NAME\n\t\tAND PK.CONSTRAINT_TYPE = ''Primary Key''\nWHERE PC.TableGroup = @TableGroup\n\tAND PC.IsEnabled = 1\nGROUP BY PC.TableId,\n\tPC.SourceSchema,\n\tPC.SourceTable,\n\tPC.TargetSchema,\n\tPC.TargetTable,\n\tPC.KeyColumns,\n\tPC.IsIncremental,\n\tPK.CONSTRAINT_NAME\n'\n\n/****** Object: StoredProcedure [orchestration].[GeneratePrimaryKey] ******/\nIF OBJECT_ID('[orchestration].[GeneratePrimaryKey]', 'P') IS NULL\nEXEC sp_executesql @stmt = N'\nCREATE OR ALTER PROCEDURE [orchestration].[GeneratePrimaryKey]\n\t@Schema nvarchar(128), \n\t@Table nvarchar(128), \n\t@KeyColumns nvarchar(MAX)\n\nAS\n\n\n--Make sure that a Primary Key constraint does not exist on the specified table\nIF NOT EXISTS (\n\tSELECT * \n\tFROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS\n\tWHERE CONSTRAINT_TYPE = ''Primary Key''\n\tAND TABLE_SCHEMA = @Schema\n\tAND TABLE_NAME = @Table\n)\n\nBEGIN\n\t--Parse and reformat the list of key columns in a manner that will be suitable for subsequent processing\n\tDECLARE @KeyColumnsFormatted nvarchar(MAX) \n\tSELECT @KeyColumnsFormatted = STRING_AGG(QUOTENAME([value]), '','') FROM STRING_SPLIT(@KeyColumns, '','')\n\n\tDECLARE @SQL nvarchar(MAX) = ''''\n\n\t--Make key columns non-nullable\n\tSELECT @SQL = @SQL + ''ALTER TABLE [''+ @Schema + ''].['' + @Table + ''] ALTER COLUMN ['' + name + ''] '' + system_type_name + '' NOT NULL; ''\n\tFROM sys.dm_exec_describe_first_result_set(''SELECT '' + @KeyColumnsFormatted + '' FROM [''+ @Schema + ''].['' + @Table + '']'' , NULL, NULL)\n\tEXEC sp_executesql @stmt = @SQL\n\t\n\t--Add primary key\n\tSET @SQL = ''ALTER TABLE [''+ @Schema + ''].['' + @Table + ''] ADD CONSTRAINT [PK_'' + @Schema + ''_'' + @Table + ''] PRIMARY KEY CLUSTERED ('' + @KeyColumnsFormatted + '')''\n\tEXEC sp_executesql @stmt = @SQL\nEND\n'\n\n/****** Object: StoredProcedure [orchestration].[SchemaDriftHandler] ******/\nIF OBJECT_ID('[orchestration].[SchemaDriftHandler]', 'P') IS NULL\nEXEC sp_executesql @stmt = N'\nCREATE OR ALTER PROCEDURE [orchestration].[SchemaDriftHandler] \n\t@Schema nvarchar(128), \n\t@Table nvarchar(128), \n\t@ColumnDefinitions nvarchar(MAX)\n\nAS\n\nDECLARE @AddSQL nvarchar(MAX), @AlterSQL nvarchar(MAX)\n\n--Parse the column definition parameter passed from the source, identify columns that do not exist in the target, and generate a SQL statement for adding the columns\nIF OBJECT_ID(''[''+ @Schema + ''].['' + @Table + '']'', ''U'') IS NOT NULL\nBEGIN\n\tSELECT @AddSQL = ''ALTER TABLE [''+ @Schema + ''].['' + @Table + ''] ADD '' + STRING_AGG(CAST(QUOTENAME([Source].ColumnName) + '' '' + [Source].Type AS nvarchar(MAX)), '', '')\n\tFROM OPENJSON(@ColumnDefinitions)\n\t\tWITH (\n\t\t\tColumnName varchar(128) ''$.ColumnName'',\n\t\t\tType varchar(128) ''$.Type''\n\t\t) AS [Source]\n\t\tLEFT JOIN INFORMATION_SCHEMA.COLUMNS AS [Target]\n\t\t\tON [Target].TABLE_SCHEMA = @Schema\n\t\t\tAND [Target].TABLE_NAME = @Table\n\t\t\tAND [Source].ColumnName = [Target].COLUMN_NAME\n\tWHERE [Target].COLUMN_NAME IS NULL\nEND\n\n--If the SQL statement is not null and the target table exists, execute the SQL statement\nIF @AddSQL IS NOT NULL AND OBJECT_ID(''[''+ @Schema + ''].['' + @Table + '']'', ''U'') IS NOT NULL\nBEGIN\n\tEXEC sp_executesql @stmt = @AddSQL\nEND\n\n--Update the data type of the SyncedToSqlDbOn column added to the destination tables\nSELECT @AlterSQL = ''ALTER TABLE [''+ @Schema + ''].['' + @Table + ''] ALTER COLUMN SyncedToSqlDbOn DateTime2''\n\tFROM INFORMATION_SCHEMA.COLUMNS AS [Target]\n\tWHERE [Target].TABLE_SCHEMA = @Schema\n\t\tAND [Target].TABLE_NAME = @Table\n\t\tAND [Target].COLUMN_NAME = ''SyncedToSqlDbOn''\n\t\tAND [Target].DATA_TYPE <> ''datetime2''\n\n--If the SQL statement is not null\nIF @AlterSQL IS NOT NULL\nBEGIN\n\tEXEC sp_executesql @stmt = @AlterSQL\nEND\n'"}]}}],"policy":{"elapsedTimeMetric":{},"cancelAfter":{}},"parameters":{"AutoPopulateListOfTablesToSync":{"type":"bool","defaultValue":true},"AutoGeneratePrimaryKeys":{"type":"bool","defaultValue":true},"TableGroupToSync":{"type":"int","defaultValue":1},"UsePartitionedTables":{"type":"bool","defaultValue":false},"DefaultTargetSchema":{"type":"string","defaultValue":"dbo"}},"variables":{"Structure":{"type":"Array"}},"folder":{"name":"Dataverse - Synapse Serverless to SQLDB"},"annotations":[],"lastPublishTime":"2022-09-16T13:55:00Z"},"dependsOn":["[concat(variables('workspaceId'), '/datasets/DataverseSQLDB')]","[concat(variables('workspaceId'), '/pipelines/Handle Schema Drift')]","[concat(variables('workspaceId'), '/pipelines/Populate List of Tables to Sync')]","[concat(variables('workspaceId'), '/pipelines/Table Full Copy')]","[concat(variables('workspaceId'), '/pipelines/Table Incremental Copy')]"]},{"name":"[concat(parameters('workspaceName'), '/DataverseSQLDB')]","type":"Microsoft.Synapse/workspaces/datasets","apiVersion":"2019-06-01-preview","properties":{"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"},"parameters":{"SchemaName":{"type":"string"},"TableName":{"type":"string"}},"annotations":[],"type":"AzureSqlTable","schema":[],"typeProperties":{"schema":{"value":"@dataset().SchemaName","type":"Expression"},"table":{"value":"@dataset().TableName","type":"Expression"}}},"dependsOn":[]},{"name":"[concat(parameters('workspaceName'), '/Handle Schema Drift')]","type":"Microsoft.Synapse/workspaces/pipelines","apiVersion":"2019-06-01-preview","properties":{"description":"Detect schema drift and, if necessary, add new columns to the target table.","activities":[{"name":"Execute stored procedure","description":"Execute the orchestration.SchemaDriftAddColumns procedure","type":"Script","dependsOn":[{"activity":"For each column","dependencyConditions":["Succeeded"]}],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"},"typeProperties":{"scripts":[{"type":"Query","text":{"value":"@concat('EXEC [orchestration].[SchemaDriftHandler] \n\t@Schema = ''', pipeline().parameters.TargetSchema,''',\n\t@Table = ''',pipeline().parameters.TargetTable,''',\n\t@ColumnDefinitions =''', string(variables('ColumnDefinitions')), '''')","type":"Expression"}}]}},{"name":"Get source table definition","type":"Lookup","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"source":{"type":"AzureSqlSource","sqlReaderQuery":{"value":"@concat('EXEC sp_describe_first_result_set @tsql = N''SELECT TOP 1 * FROM [',pipeline().parameters.SourceSchema,'].[',pipeline().parameters.SourceTable,']''')","type":"Expression"},"queryTimeout":"02:00:00","partitionOption":"None"},"dataset":{"referenceName":"DataverseSynapseServerlessDB","type":"DatasetReference","parameters":{"TableName":"n/a","SchemaName":"n/a"}},"firstRowOnly":false}},{"name":"For each column","description":"Iterate over each column in the source table","type":"ForEach","dependsOn":[{"activity":"Get source table definition","dependencyConditions":["Succeeded"]}],"userProperties":[],"typeProperties":{"items":{"value":"@activity('Get source table definition').output.value","type":"Expression"},"batchCount":50,"activities":[{"name":"Append column definition","description":"Append column name and data type to an array variable","type":"AppendVariable","dependsOn":[],"userProperties":[],"typeProperties":{"variableName":"ColumnDefinitions","value":{"value":"@json(concat('{\"ColumnName\":\"', item().name, '\", \"Type\":\"', item().system_type_name, '\"}'))","type":"Expression"}}}]}}],"policy":{"elapsedTimeMetric":{},"cancelAfter":{}},"parameters":{"SourceSchema":{"type":"string"},"SourceTable":{"type":"string"},"TargetSchema":{"type":"string"},"TargetTable":{"type":"string"}},"variables":{"Structure":{"type":"Array"},"ColumnDefinitions":{"type":"Array"}},"folder":{"name":"Dataverse - Synapse Serverless to SQLDB"},"annotations":[],"lastPublishTime":"2022-09-16T13:54:37Z"},"dependsOn":["[concat(variables('workspaceId'), '/datasets/DataverseSynapseServerlessDB')]"]},{"name":"[concat(parameters('workspaceName'), '/Populate List of Tables to Sync')]","type":"Microsoft.Synapse/workspaces/pipelines","apiVersion":"2019-06-01-preview","properties":{"description":"Identify tables in the source database that appear to be suitable for incremental or full copy behavior and load them into the orchestration.ProcessingControl table.\n\nNote: review the list of tables in the orchestration.ProcessingControl table to ensure that the list matches your requirements.","activities":[{"name":"Copy list of tables to process","description":"Identify tables in the source database that have the suffixes of \"_partitioned\" and certain metadata tables, determine whether they appear to be suitable for incremental or full copy behavior and upsert them into the orchestration.ProcessingControl table.","type":"Copy","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"source":{"type":"AzureSqlSource","sqlReaderQuery":{"value":"@replace(replace('--Specify whether the solution should use the \"_partitioned\" tables as its source\nDECLARE @UsePartitionedTables BIT = UsePartitionedTablesParameter\n\n--Get a list of tables with the suffixes of \"_partitioned\" and certain metadata tables from the dbo schema\n; WITH DiscoveredTables AS (\nSELECT T.TABLE_SCHEMA AS SourceSchema,\n\tT.TABLE_NAME AS SourceTable,\n\tIIF(T.TABLE_NAME LIKE ''%_partitioned'', LEFT(T.TABLE_NAME, LEN(T.TABLE_NAME)-12), T.TABLE_NAME) AS TargetTable,\n\t--If the table contains columns Id, IsDeleted, SinkModifiedOn and versionnumber treat it as an incrementally-updated data table\n\tIIF(SUM(IIF(C.COLUMN_NAME IN (''Id'', ''IsDelete'', ''SinkModifiedOn'', ''versionnumber''), 1, 0)) = 4, 1, 0) AS IsIncrementalDataTable\nFROM INFORMATION_SCHEMA.TABLES T\n\tJOIN INFORMATION_SCHEMA.COLUMNS C\n\t\tON T.TABLE_SCHEMA= C.TABLE_SCHEMA\n\t\tAND T.TABLE_NAME = C.TABLE_NAME\nWHERE T.TABLE_SCHEMA = ''dbo''\n\tAND (\n\t\t(@UsePartitionedTables = 0 AND T.TABLE_NAME NOT LIKE ''%_partitioned'')\n\t\tOR (@UsePartitionedTables = 1 AND T.TABLE_NAME LIKE ''%_partitioned'')\n\t\tOR T.TABLE_NAME IN (''StateMetadata'', ''StatusMetadata'', ''TargetMetadata'', ''OptionsetMetadata'', ''GlobalOptionsetMetadata'')\n\t\t)\nGROUP BY T.TABLE_SCHEMA,\n\tT.TABLE_NAME\n)\n\nSELECT T.SourceSchema,\n\tT.SourceTable,\n\t''TargetSchemaParameter'' AS TargetSchema,\n\tT.TargetTable,\n\t--If the table contains columns Id and IsDeleted, treat it as an incrementally-updated table with a KeyColumnName of Id\n\t--Otherwise, assume that it requires a full refresh\n\tCASE WHEN \n\t\tT.IsIncrementalDataTable = 1 THEN ''Id'' \n\t\tWHEN T.SourceTable = ''GlobalOptionsetMetadata'' THEN ''GlobalOptionSetName,Option,LocalizedLabelLanguageCode'' \n\t\tWHEN T.SourceTable = ''OptionsetMetadata'' THEN ''EntityName,OptionSetName,Option,LocalizedLabelLanguageCode'' \n\t\tWHEN T.SourceTable = ''StateMetadata'' THEN ''EntityName,State,LocalizedLabelLanguageCode'' \n\t\tWHEN T.SourceTable = ''StatusMetadata'' THEN ''EntityName,Status,LocalizedLabelLanguageCode'' \n\t\tWHEN T.SourceTable = ''TargetMetadata'' THEN ''EntityName,AttributeName,ReferencedEntity,ReferencedAttribute'' \n\t\tEND AS KeyColumns,\n\tCAST(IIF(T.IsIncrementalDataTable = 1, 1, 0) AS BIT) AS IsIncremental\nFROM DiscoveredTables T\nWHERE T.IsIncrementalDataTable = 1 OR T.SourceTable IN (''StateMetadata'', ''StatusMetadata'', ''TargetMetadata'', ''OptionsetMetadata'', ''GlobalOptionsetMetadata'')\n', 'UsePartitionedTablesParameter', if(pipeline().parameters.UsePartitionedTables, '1', '0')), 'TargetSchemaParameter', pipeline().parameters.TargetSchema)","type":"Expression"},"queryTimeout":"02:00:00","partitionOption":"None"},"sink":{"type":"AzureSqlSink","writeBehavior":"upsert","upsertSettings":{"useTempDB":false,"keys":["SourceSchema","SourceTable"],"interimSchemaName":"staging"},"sqlWriterUseTableLock":false,"disableMetricsCollection":false},"enableStaging":false,"translator":{"type":"TabularTranslator","typeConversion":true,"typeConversionSettings":{"allowDataTruncation":true,"treatBooleanAsNumber":false}}},"inputs":[{"referenceName":"DataverseSynapseServerlessDB","type":"DatasetReference","parameters":{"TableName":"n/a","SchemaName":"n/a"}}],"outputs":[{"referenceName":"DataverseSQLDB","type":"DatasetReference","parameters":{"SchemaName":"orchestration","TableName":"ProcessingControl"}}]}],"policy":{"elapsedTimeMetric":{},"cancelAfter":{}},"parameters":{"UsePartitionedTables":{"type":"bool","defaultValue":true},"TargetSchema":{"type":"string","defaultValue":"dbo"}},"folder":{"name":"Dataverse - Synapse Serverless to SQLDB"},"annotations":[],"lastPublishTime":"2022-09-16T13:54:44Z"},"dependsOn":["[concat(variables('workspaceId'), '/datasets/DataverseSynapseServerlessDB')]","[concat(variables('workspaceId'), '/datasets/DataverseSQLDB')]"]},{"name":"[concat(parameters('workspaceName'), '/Table Full Copy')]","type":"Microsoft.Synapse/workspaces/pipelines","apiVersion":"2019-06-01-preview","properties":{"description":"Perform a full copy of a table (truncate and reload the destination table)","activities":[{"name":"Copy and Upsert Data","description":"Retrieve all data from the source table and upsert it into the destination table. Create a new table (if it does not exist). Log the start of a sync process.\n\nNote: the read behavior involves reading all data from source. The write behavior is an upsert.","type":"Copy","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":3,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"source":{"type":"AzureSqlSource","additionalColumns":[{"name":"SyncedToSqlDbOn","value":{"value":"@pipeline().TriggerTime","type":"Expression"}}],"queryTimeout":"02:00:00","partitionOption":"None"},"sink":{"type":"AzureSqlSink","preCopyScript":{"value":"@{concat('INSERT INTO [orchestration].[ProcessingLog]\n ([TableId],\n [PipelineRunId],\n [ProcessingStarted])\n VALUES\n (''', string(pipeline().parameters.TableId), ''',\n ''', pipeline().RunId, ''',\n ''', string(pipeline().TriggerTime), ''')\n ')}","type":"Expression"},"writeBehavior":"upsert","upsertSettings":{"useTempDB":true,"keys":{"value":"@split(pipeline().parameters.KeyColumns, ',')","type":"Expression"}},"sqlWriterUseTableLock":false,"tableOption":"autoCreate","disableMetricsCollection":false},"enableStaging":false,"translator":{"type":"TabularTranslator","typeConversion":true,"typeConversionSettings":{"allowDataTruncation":true,"treatBooleanAsNumber":false}}},"inputs":[{"referenceName":"DataverseSynapseServerlessDB","type":"DatasetReference","parameters":{"TableName":{"value":"@pipeline().parameters.SourceTable","type":"Expression"},"SchemaName":{"value":"@pipeline().parameters.SourceSchema","type":"Expression"}}}],"outputs":[{"referenceName":"DataverseSQLDB","type":"DatasetReference","parameters":{"SchemaName":{"value":"@pipeline().parameters.TargetSchema","type":"Expression"},"TableName":{"value":"@pipeline().parameters.TargetTable","type":"Expression"}}}]},{"name":"Log successful processing end","description":"Update a log record to indicate successful completion of the sync process.","type":"Script","dependsOn":[{"activity":"Copy and Upsert Data","dependencyConditions":["Completed"]}],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"},"typeProperties":{"scripts":[{"type":"Query","text":{"value":"@concat('\nUPDATE orchestration.ProcessingLog\nSET ProcessingEnded = GETUTCDATE(),\n IsSuccessful = ', string(if(equals(activity('Copy and Upsert Data').output.executionDetails[0].status, 'Succeeded'), 1, 0)), ',\n RowsCopied = ', string(activity('Copy and Upsert Data').output.rowsCopied), '\nWHERE TableId = ', string(pipeline().parameters.TableId),' \n AND PipelineRunId = ''', pipeline().RunId, '''')","type":"Expression"}}]}},{"name":"Fail pipeline","description":"Fail pipeline execution in the event of copy activity failure.","type":"Fail","dependsOn":[{"activity":"Log successful processing end","dependencyConditions":["Completed"]},{"activity":"Copy and Upsert Data","dependencyConditions":["Failed"]}],"userProperties":[],"typeProperties":{"message":"1000","errorCode":"Failed pipeline execution due to copy activity failure."}}],"policy":{"elapsedTimeMetric":{},"cancelAfter":{}},"parameters":{"SourceSchema":{"type":"string","defaultValue":"dbo"},"SourceTable":{"type":"string"},"TargetSchema":{"type":"string","defaultValue":"dbo"},"TargetTable":{"type":"string"},"TableId":{"type":"int"},"KeyColumns":{"type":"string"}},"folder":{"name":"Dataverse - Synapse Serverless to SQLDB"},"annotations":[],"lastPublishTime":"2022-09-16T13:54:51Z"},"dependsOn":["[concat(variables('workspaceId'), '/datasets/DataverseSynapseServerlessDB')]","[concat(variables('workspaceId'), '/datasets/DataverseSQLDB')]"]},{"name":"[concat(parameters('workspaceName'), '/Table Incremental Copy')]","type":"Microsoft.Synapse/workspaces/pipelines","apiVersion":"2019-06-01-preview","properties":{"description":"Perform an incremental copy of a table (upsert)","activities":[{"name":"Copy and Upsert Data","description":"Retrieve and de-duplicate data from the source table and upsert it into the destination table. Create the destination table if it does not exist. Log the start of a sync process.","type":"Copy","dependsOn":[],"policy":{"timeout":"7.00:00:00","retry":3,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"typeProperties":{"source":{"type":"AzureSqlSource","additionalColumns":[{"name":"SyncedToSqlDbOn","value":{"value":"@pipeline().TriggerTime","type":"Expression"}}],"sqlReaderQuery":{"value":"@replace(replace(replace(replace(replace('\n--Get a set of latest records from a table modified between specific watermark dates\n\n; WITH CurrentRecord AS (\nSELECT [KeyColumn], \n\tMAX(versionnumber) AS versionnumber,\n\tMAX(SinkModifiedOn) AS SinkModifiedOn\nFROM [SourceSchema].[SourceTable]\nWHERE SinkModifiedOn >= ''1900-01-01'' \n\tAND SinkModifiedOn < ''2999-12-31''\nGROUP BY [KeyColumn]\n)\n\nSELECT BaseTable.*\nFROM [SourceSchema].[SourceTable] AS BaseTable\n\tJOIN CurrentRecord\n\t\tON BaseTable.[KeyColumn] = CurrentRecord.[KeyColumn]\n\t\tAND BaseTable.versionnumber = CurrentRecord.versionnumber\n\t\tAND BaseTable.SinkModifiedOn = CurrentRecord.SinkModifiedOn\n', \n'SourceSchema', pipeline().parameters.SourceSchema),\n'SourceTable', pipeline().parameters.SourceTable),\n\n'1900-01-01', pipeline().parameters.LowWatermark),\n'2099-12-31', pipeline().parameters.HighWatermark),\n'KeyColumn', pipeline().parameters.KeyColumn)","type":"Expression"},"queryTimeout":"02:00:00","partitionOption":"None"},"sink":{"type":"AzureSqlSink","preCopyScript":{"value":"@{concat('INSERT INTO [orchestration].[ProcessingLog]\n ([TableId],\n [PipelineRunId],\n [ProcessingStarted],\n [LowWatermark],\n [HighWatermark])\n VALUES\n (''', string(pipeline().parameters.TableId), ''',\n ''', pipeline().RunId, ''',\n ''', string(pipeline().TriggerTime), ''',\n ''', pipeline().parameters.LowWatermark, ''',\n ''', pipeline().parameters.HighWatermark, ''')')}","type":"Expression"},"writeBehavior":"upsert","upsertSettings":{"useTempDB":false,"keys":{"value":"@split(pipeline().parameters.KeyColumn, ',')","type":"Expression"},"interimSchemaName":"staging"},"sqlWriterUseTableLock":false,"tableOption":"autoCreate","disableMetricsCollection":false},"enableStaging":false,"translator":{"type":"TabularTranslator","typeConversion":true,"typeConversionSettings":{"allowDataTruncation":true,"treatBooleanAsNumber":false}}},"inputs":[{"referenceName":"DataverseSynapseServerlessDB","type":"DatasetReference","parameters":{"TableName":"n/a","SchemaName":"n/a"}}],"outputs":[{"referenceName":"DataverseSQLDB","type":"DatasetReference","parameters":{"SchemaName":{"value":"@pipeline().parameters.TargetSchema","type":"Expression"},"TableName":{"value":"@pipeline().parameters.TargetTable","type":"Expression"}}}]},{"name":"Log processing end","description":"Update a log record to indicate successful completion of the sync process.","type":"Script","dependsOn":[{"activity":"Copy and Upsert Data","dependencyConditions":["Completed"]}],"policy":{"timeout":"7.00:00:00","retry":0,"retryIntervalInSeconds":30,"secureOutput":false,"secureInput":false},"userProperties":[],"linkedServiceName":{"referenceName":"[parameters('DestinationSQLDB')]","type":"LinkedServiceReference"},"typeProperties":{"scripts":[{"type":"Query","text":{"value":"@concat('\nUPDATE orchestration.ProcessingLog\nSET ProcessingEnded = GETUTCDATE(),\n IsSuccessful = ', string(if(equals(activity('Copy and Upsert Data').output.executionDetails[0].status, 'Succeeded'), 1, 0)), ',\n RowsCopied = ', string(activity('Copy and Upsert Data').output.rowsCopied), '\nWHERE TableId = ', string(pipeline().parameters.TableId),' \n AND PipelineRunId = ''', pipeline().RunId, '''')","type":"Expression"}}]}},{"name":"Fail pipeline","description":"Fail pipeline execution in the event of copy activity failure.","type":"Fail","dependsOn":[{"activity":"Copy and Upsert Data","dependencyConditions":["Failed"]},{"activity":"Log processing end","dependencyConditions":["Completed"]}],"userProperties":[],"typeProperties":{"message":"1000","errorCode":"Failed pipeline execution due to copy activity failure."}}],"policy":{"elapsedTimeMetric":{},"cancelAfter":{}},"parameters":{"SourceSchema":{"type":"string","defaultValue":"dbo"},"SourceTable":{"type":"string"},"TargetSchema":{"type":"string","defaultValue":"dbo"},"TargetTable":{"type":"string"},"LowWatermark":{"type":"string","defaultValue":"1900-01-01"},"HighWatermark":{"type":"string","defaultValue":"2999-12-31"},"KeyColumn":{"type":"string","defaultValue":"Id"},"TableId":{"type":"int"},"GeneratePrimaryKey":{"type":"bool"}},"folder":{"name":"Dataverse - Synapse Serverless to SQLDB"},"annotations":[],"lastPublishTime":"2022-09-16T13:54:55Z"},"dependsOn":["[concat(variables('workspaceId'), '/datasets/DataverseSynapseServerlessDB')]","[concat(variables('workspaceId'), '/datasets/DataverseSQLDB')]"]},{"name":"[concat(parameters('workspaceName'), '/DataverseSynapseServerlessDB')]","type":"Microsoft.Synapse/workspaces/datasets","apiVersion":"2019-06-01-preview","properties":{"linkedServiceName":{"referenceName":"[parameters('SourceSynapseServerlessDB')]","type":"LinkedServiceReference"},"parameters":{"TableName":{"type":"string"},"SchemaName":{"type":"string"}},"annotations":[],"type":"AzureSqlTable","schema":[],"typeProperties":{"schema":{"value":"@dataset().SchemaName","type":"Expression"},"table":{"value":"@dataset().TableName","type":"Expression"}}},"dependsOn":[]}]} \ No newline at end of file diff --git a/community templates/DataverseToAzureSQLDB/manifest.json b/community templates/DataverseToAzureSQLDB/manifest.json new file mode 100644 index 00000000..9e6cc59c --- /dev/null +++ b/community templates/DataverseToAzureSQLDB/manifest.json @@ -0,0 +1,48 @@ +{ + "name": "Sync Dataverse data from Synapse Serverless to Azure SQL DB", + "description": "Extend Azure Synapse Link for Dataverse to sync Dataverse data from a Synapse Serverless SQL database to Azure SQL DB. This template accelerates migration from the deprecated Data Export Service for Dataverse.", + "image": "LookupGet tables toprocessForEachFor each tableActivitiesExecuteSchema...SeparateFull Copy...Add aprimary...+If ConditionAuto-Populate Listof Tables to SyncTruePopulateList of...+False+ScriptAdd orchestrationobjects to target...", + "icons": [ + "Lookup", + "ForEach", + "IfCondition" + ], + "requires": { + "linkedservices": { + "DestinationSQLDB": { + "supportTypes": [ + "AzureSqlDatabase" + ] + }, + "SourceSynapseServerlessDB": { + "supportTypes": [ + "AzureSqlDatabase" + ] + } + } + }, + "contributorType": "Community", + "author": "Slava Trofimov", + "documentation": "https://github.com/Azure/Azure-DataFactory/blob/main/community%20templates/documentation/DataverseToAzureSQLDB/DataverseToAzureSQLDB.md", + "annotations": [ + "Synapse Link", + "Synapse Link for Dataverse", + "Copy", + "Dataverse", + "Azure SQL DB", + "Azure SQL Database", + "DES", + "Data Export Service", + "Dynamics" + ], + "services": [ + "Synapse Serverless SQL Pools", + "Azure SQL Database" + ], + "categories": [ + "Synapse Link", + "Copy", + "Synapse", + "Integration" + ] +} \ No newline at end of file diff --git a/community templates/documentation/DataverseToAzureSQLDB/DataverseToAzureSQLDB.md b/community templates/documentation/DataverseToAzureSQLDB/DataverseToAzureSQLDB.md new file mode 100644 index 00000000..81a1daf0 --- /dev/null +++ b/community templates/documentation/DataverseToAzureSQLDB/DataverseToAzureSQLDB.md @@ -0,0 +1,160 @@ +# Sync Dataverse data from Synapse Serverless to Azure SQL DB + Extend Azure Synapse Link for Dataverse by syncing Dataverse data to an Azure SQL DB. + +## Background and Problem Statement +[Microsoft Dataverse](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/data-platform-intro) is a secure and versatile data storage and management layer for a variety of business applications, such as Microsoft Dynamics, Power Apps, Power Automate, etc. [Synapse Link for Dataverse](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/export-to-data-lake) provides a seamless mechanism for continuously exporting Dataverse data to your Synapse Analytics Workspace for integration, analytics and business intelligence purposes. + +While data exported via Synapse Link for Dataverse can be accessed using Synapse Analytics Serverless SQL Pools, some customers may prefer to make Dataverse data available in an Azure SQL Database to support a broader range of data integration or data enrichment requirements. This scenario may be particularly relevant for customers who previously used the [Data Export Service (DES)](https://docs.microsoft.com/en-us/power-apps/developer/data-platform/data-export-service) to bring Dataverse data from their Microsoft Dynamics applications to their Azure SQL Database. + +The Data Export Service was deprecated in November 2021 and will reach its [end-of-support and end-of-life in November 2022](https://powerapps.microsoft.com/en-us/blog/do-more-with-data-from-data-export-service-to-azure-synapse-link-for-dataverse/). Synapse Link for Dataverse does not natively support an Azure SQL DB as the destination for data export. However, a flexible and scalable data integration solution can be implemented to copy Dataverse data from a Synapse Analytics Workspace an Azure SQL database as a replacement for the Data Export Service. + +## Solution Overview +This repository includes a solution accelerator for incrementally synchronizing Dataverse data from external tables in Synapse Serverless SQL Pool to an Azure SQL Database. The solution consists of Synapse Pipelines for data movement, as well as database objects for configuration and logging of the data integration process. This solution can be rapidly deployed to dynamically synchronize any number of tables between a Serverless SQL Pool and an Azure SQL DB. + +The architecture of this solution is depicted on the following diagram: + +![Solution Architecture](Images/SolutionArchitecture.png) + +This solution supports copying tables either incrementally or in full. Most tables will be loaded incrementally. However, certain metadata tables, such as StateMetadata, StatusMetadata, OptionsetMetadata, GlobalOptionsetMetadata and TargetMetadata should be loaded in full (since they tend to be small and do not have relevant columns to indicate when specific records have been modified). + +The solution keeps track of integration pipeline runs for each table and retrieves only those records that have been added, changed or soft-deleted since the latest successful pipeline run. + +In order to facilitate incremental copying of data, this solution requires table export in Synapse Link for Dataverse to be configured in *append-only mode* as described in the following [article](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-advanced-configuration#in-place-updates-vs-append-only-writes). Hence, data available in the Serverless SQL Pool may contain multiple versions of any given record, as that record evolves over time. However, this solution deduplicates the data in such a way that the destination Azure SQL Database contains only the latest version of any given record, which simplifies the consumption of the data. + +Deleted records in incrementally copied tables are handled as soft deletes by adding a flag to the IsDelete column. If desired, database views can be added in the target SQL database to filter out the deleted records. + +For scenarios requiring lower latencies (such as near-real-time access to data), the solution can be configured not to use the "_partitioned" tables based on hourly snapshots, but rather regular tables that are receiving data from Synapse Link on an ongoing basis. + +This solution automatically handles common types of schema evolution in the source system. Synapse Link for Dataverse will automatically accommodate newly added columns (as documented [here](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/export-data-lake-faq)). This solution will detect newly-added columns during each pipeline execution and will add corresonding columns to the tables in the target database. Columns deleted from the source system will remain in the target database, but will no longer be updated. + +This solution will automatically create several helper objects in the target Azure SQL Database during the first synchronization. These objects will support configuration and logging of the data integration process. Following is the list of helper database objects: + +- Schemas: orchestration and staging +- Tables: orchestration.ProcessingControl and orchestration.ProcessingLog +- Stored Procedures: orchestration.GetTablesToProcess, orchestration.GeneratePrimaryKey and orchestration.SchemaDriftHandler. + +## Implementation +### Prerequisites +1. You have [provisioned a Synapse Analytics Workspace](https://docs.microsoft.com/en-us/azure/synapse-analytics/quickstart-create-workspace). +1. You have [configured Synapse Link for Dataverse to export relevant entities to a Synapse Analytics Workspace](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-synapse). This solution requires table export to be configured in *append-only mode* as described in the following [article](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-advanced-configuration#in-place-updates-vs-append-only-writes). +1. You have sufficient read access to the lake database created by Synapse Link for Dataverse and to the underlying Data Lake storage account. +1. You have admninistrative access to the Synapse Analytics Workspace +1. You have administrative access to the target Azure SQL DB. + +### Installation +1. Provision an Azure SQL Database to serve as the target of your Dataverse data. [See documentation](https://docs.microsoft.com/en-us/azure/azure-sql/database/single-database-create-quickstart?view=azuresql&tabs=azure-portal). Ensure that the "Allow Azure services and resources to access this server" setting is enabled. [See documentation](https://docs.microsoft.com/en-us/azure/azure-sql/database/firewall-configure?view=azuresql) + +2. Grant your Synapse Analytics Workspace access to your target Azure SQL Database by adding the managed identity of your Synapse Analytics Workspace to the db_owner role in the Azure SQL Database. [See additional documentation](https://docs.microsoft.com/en-us/azure/data-factory/connector-azure-sql-database?tabs=data-factory#managed-identity). You may use the following SQL statement: + +```SQL +CREATE USER [YourSynapseAnalyticsWorkspaceName] FROM EXTERNAL PROVIDER +GO +ALTER ROLE [db_owner] ADD MEMBER [YourSynapseAnalyticsWorkspaceName] +GO +``` +3. Ensure that the managed identity of your Synapse Analytics Workspace has access to the storage account container where your Dataverse data is stored by adding it to the *Storage Blob Data Reader* role. [See additional documentation](https://docs.microsoft.com/en-us/azure/synapse-analytics/security/how-to-grant-workspace-managed-identity-permissions). + +4. "Browse gallery" to find the pipeline template corresponding to this solution. Then, import the template from the gallery: + +![Import pipelines from template](Images/ImportPipelineFromTemplate.png) + +5. During the template import process, configure linked services for target Azure SQL DB and the source Serverless SQL Pool endpoint (as illustrated below). + +![Import pipelines from template](Images/ConfigureLinkedServices.png) + +6. Note: while configuring linked services for the source and target databases, please manually specify the fully-qualified domain name of your SQL endpoint and database name as illustrated below: + +![Import pipelines from template](Images/ConfigureLinkedServices-detail.png) + +7. Once the import process completes, you will find five pipelines in the *Dataverse - Synapse Serverless to SQLDB* folder, as illustrated below: + +![Imported pipelines](Images/ImportedPipelines.png) + +8. Clikc on the *Publish All* button in the header of your Synapse Analytics Workspace to publish the pipelines and related artifacts to your Synapse Workspace. + +### Configure and test your pipeline +**Sync Orchestration** is the main pipeline responsible for orchestrating the data synchronization process. To test the data synchronization process, use the *Trigger now* feature for the *Sync Orchestration* pipeline, as illustrated below. + +![Trigger orchestration pipeline now](Images/TriggerNow.png) + +While triggering the execution of the pipeline, you will be prompted to configure several parameters that allow you to customize its behavior to meet your needs. + +> - AutoPopulateListOfTablesToSync +> - AutoGeneratePrimaryKeys +> - TableGroupToSync +> - UsePartitionedTables +> - DefaultTargetSchema + +1. **AutoPopulateListOfTablesToSync** (default: true): by default, the solution is designed to perform automatic discovery of tables available in the source Serverless SQL database. Any table that appears to contains Dataverse data, as well as certain metadata tables (StateMetadata, StatusMetadata, OptionsetMetadata, GlobalOptionsetMetadata and TargetMetadata) will be automatically added to the *orchestration.ProcessingControl* table. If you prefer to disable auto-discovery (perhaps, after initially populating the list of desired tables), please set the *AutoPopulateListOfTablesToSync* parameter in the *Sync Orchestration* pipeline to *false*. Note, to maximize efficiency, it is recommended to disable automatic discovery of tables when configuring triggers that will be executed with high frequency (for near-real-time data access scenarios). + +1. **AutoGeneratePrimaryKeys** (default: true): by default, the solution will automatically add a clustered primary key index to each target table that does not have a primary key already. These primary keys will improve the efficiency of the incremental sync process. If you prefer to manage primary key creation manually, you may disable automatic primary key generation by setting the *AutoGeneratePrimaryKeys* parameter in the *Sync Orchestration* pipeline to *false*. + +1. **TableGroupToSync** (default: 1): by default, *all* source tables will be synced to the target database whenever the *Sync Orchestration* pipeline is executed. Yet, this may not be desirable if data latency requirements differ significantly across tables. When low latency of data is expected for some tables, these tables can be addded to a designated Table Group and their synchornization can be triggered on a frequent schedule. Other tables can be added to a different Table Group and their synchornization can be trigger on a less frequent schedule. + + 1. All newly discovered table will be added to Table Group 1, when they are added to the *orchestration.ProcessingControl* table. + 1. If desired, you may update records in the *orchestration.ProcessingControl* table to reassign specific tables to a separate Table Group (such as TableGroup 2, 3, etc.) + 1. When triggering the execution of the *Sync Orchestration* pipeline, specify which TableGroup should be synchornized by setting the value of the *TableGroupToSync* parameter. + +1. **UsePartitionedTables** (default: true): by default, this solution is configured to use external tables in the Serverless SQL Pool database that leverage [read-only hourly snapshots](https://docs.microsoft.com/en-us/power-apps/maker/data-platform/azure-synapse-link-synapse#access-near-real-time-data-and-read-only-snapshot-data-preview). + + 1. Using read-only snapshots helps to avoid read/write contention issues while reading data from files that are being written to by Synapse Link for Dataverse. Tables based on snapshot data in Serverless SQL Pool databases are labeled with the "_partitioned" suffix. Note, at the time of this writing, Synapse Link for Dataverse would not create snapshot data for empty tables. + + 1. For scenarios requiring lower latencies (such as near-real-time access to data), the solution can be configured not to use the "_partitioned" tables based on hourly snapshots, but rather regular tables that are receiving data from Synapse Link on an ongoing basis. You may do so, but setting the UsePartitionedTables parameter to *false*. To support this configuration, your Synapse Link for Dataverse must satisfy the following requirements: + + 1. Synapse Link for Dataverse must have been configured after August 2022. External Tables created by Synapse Link for Dataverse after August 2022 are configured with the [ALLOW_INCONSISTENT_READS](https://learn.microsoft.com/en-us/azure/synapse-analytics/sql/create-use-external-tables#external-table-on-appendable-files) table option, which allows for Serverless SQL Pools to read the data files while new records are being written to these files. + 1. Synapse Link for Dataverse must have been configured to export data in CSV format. At the time of this writing, Synapse Link for Dataverse implementations that export data in the Delta Lake format lack the soft-delete functionality that this synchronization solution requires. + +5. **DefaultTargetSchema** (default: dbo): by default, the solution will create destination tables in the *dbo* schema of the target database. If you prefer to create destination tables in a different schema, change the *DefaultTargetSchema* parameter to meet your requirements. + +> The *DefaultTargetSchema* you specify must exist in the target database. If necessary, create the desired schema. + +### Monitor synchronization process +After triggering the pipeline, you may monitor pipeline execution in the Synapse Analytics Workspace, as illustrated below. +![Trigger orchestration pipeline now](Images/MonitorPipelineRuns.png) + +In addition, you may monitor the outcomes of the synchronization process by querying the *orchestration.ProcessingLog* table in the target database. + +Finally, you may examine the content of tables in the target database and identify individual rows that have been added/updated at a specific time by looking at the *SyncedToSqlDbOn* field that is added to each table by this solution. + +### Configure recurring triggers +Create a scheduled trigger to execute the *Sync Orchestration* pipeline in an automated manner on a desired schedule. As discussed in the previous section, you may create multiple triggers, using different *TableGroupToSync* parameter values to optimize the synchronization of groups of tables with different data latency requirements. + +Note, when *UsePartitionedTables* parameter is set to true, pipeline execution should be scheduled no more frequently than once per hour (since underlying snapshots will be created on an hourly basis). +> **IMPORTANT!** Please ensure that the time interval between pipeline triggers is sufficiently long (compared to the duration of each pipeline execution) to prevent the possibility of multiple pipeline executions attempting to update the same group of tables at the same time. Simultaneous execution of the synchronization pipeline for the same group of tables may apply updates to certain records ouf of order, which could lead to data consistency problems! + +>When attempting to execute the synchronization pipeline frequently (for near-real-time data access), consider using the [Tumbling Window trigger](https://learn.microsoft.com/en-us/azure/data-factory/how-to-create-tumbling-window-trigger?tabs=synapse-analytics%2Cazure-powershell) (rather than Scheduled trigger) and set the [maxConcurrency property of the trigger to 1](https://learn.microsoft.com/en-us/azure/data-factory/how-to-create-tumbling-window-trigger?tabs=synapse-analytics%2Cazure-powershell#:~:text=No-,maxConcurrency,-The%20number%20of) (which will ensure that new trigger runs will be added to a queue but will not run in parallel). Note that you can have only one Tumbling Window trigger per pipeline--it is advisable to use it for the table group that requires most frequent synchronization, while using Scheduled triggers with other table groups. + + +## Next Steps and Additional Considerations +* By default, all discovered tables will included in the synchronization process. If you woudl like to exclude specific tables from synchronization, you may update records in the *orchestration.ProcessingControl* table and set the *IsEnabled* flag to 0 for any tabel that you do not wish to synchronize. + +* Consider creating non-clustered indexes to support specific query workloads that you anticipate. + +* Consider creating views on top of tables in the target SQL Database to hide deleted records to simplify data access from client applications. + +* Review performance and utilization of your target Azure SQL Database and adjust scale appropriately. + +* If necessary, adjust and refine Synapse Pipeline settings that control the performance of the data synchronization proces, such as: + * [Performance of Copy Activities](https://learn.microsoft.com/en-us/azure/data-factory/copy-activity-performance) + * Batch count of ["For Each" activity](https://learn.microsoft.com/en-us/azure/data-factory/control-flow-for-each-activity) + +* If the *AutoPopulateListOfTablesToSync* parameter in the *Sync Orchestration* pipeline is set to *true*, any new tables added to your Synapse Link for Dataverse will be automatically added to the ProcessingControl list and will be assigned to TableGroup 1. If you wish to disable the *AutoPopulateListOfTablesToSync* parameter, you may manually add new tables to be synchronized by this solution at any time. Simply add the configuration details for the desired tables to the `orchestration.ProcessingControl` table. The solution will automatically create a table in the destination datablase and will perform a full load of the table during the next scheduled pipeline execution. Incremental synchornizations will continue in the future. + +* As previously discussed, common schema evolution scenarios (i.e., columns being added or deleted) are handled automatically. However, other potential scenarios, such as data type changes will need to be handled manually. Consider the following approaches: + * Manually alter the definition of the table in the target SQL Database (recommended) + * Drop the table in the target SQL Database and delete all records in the orchestration.ProcessingLog table related to the affected table. The table will be re-added and fully loaded with data during the next scheduled synchronization. + +* This solution accelerator is designed to synchronize all columns from tables enabled for synchronization. In some scenarios, you may prefer to sync only a subset of columns from a given table (which may also improve the efficiency of the synchronization process). To accomplish that you may: + 1. Create a new Serverless SQL Database (within the same Synapse Analytics Workspace as the Lake Database created by Synapse Link for Dataverse). + 2. Create a set of cross-database views pointed to the tables in the Lake Database managed by Synapse Link for Dataverse. + 3. As part of view definitions, include the columns that you are interested in and omit the ones that are not relevant. Note, the following columns are required for incrementally-updated tables: *Id, IsDeleted, SinkModifiedOn and versionnumber*. + 4. The Linked Service in the Synapse Pipeline created by the solution accelerator will need to be pointed to the Serverless SQL Database that you have created (rather than the Lake Database created by Synapse Link for Dataverse). + +* If desired, consider hardening security settings of the implemented solution, which may include: + * Applying more restrictive firewall rules to the Azure SQL Server hosting your target database + * Granting more restrictive database permissions to the managed identity of your Synapse Analytics Workspace (as compared to the db_owner role suggested above) + + +## Acknowledgements +* Author: [Slava Trofimov](https://github.com/slavatrofimov) +* Special thanks to [Scott Sewell](https://github.com/mscottsewell) for solution testing and validation. \ No newline at end of file diff --git a/community templates/documentation/DataverseToAzureSQLDB/Images/ConfigureLinkedServices-detail.png b/community templates/documentation/DataverseToAzureSQLDB/Images/ConfigureLinkedServices-detail.png new file mode 100644 index 0000000000000000000000000000000000000000..42e37fc219bb27c0a45374f9a00c082aeca67f8b GIT binary patch literal 29385 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
  • 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

    &?Rx04&=c2A*OOy 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 E0l%-{AOHXW literal 0 HcmV?d00001 diff --git a/community templates/documentation/DataverseToAzureSQLDB/Images/ImportPipelineFromTemplate.png b/community templates/documentation/DataverseToAzureSQLDB/Images/ImportPipelineFromTemplate.png new file mode 100644 index 0000000000000000000000000000000000000000..c79a2f248757f2744e12b8a2a4de652a5f145d21 GIT binary patch literal 25647 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 literal 0 HcmV?d00001 diff --git a/community templates/documentation/DataverseToAzureSQLDB/Images/ImportedPipelines.png b/community templates/documentation/DataverseToAzureSQLDB/Images/ImportedPipelines.png new file mode 100644 index 0000000000000000000000000000000000000000..38e7714acf7729dee01aff5b05d3dead8dac4245 GIT binary patch literal 29299 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%0AGT}TYrNtidFEl12L>zq2tHjwBR=tQ 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 M+gPhY0W7P5hj$|q5AXV` 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