0

我想在两个具有系统版本(临时)表的数据库之间同步数据。Azure 中的数据同步选项不支持时态表,我需要找到另一种在数据库之间进行同步的方法。

我想使用 Azure 数据工厂将数据从一个时态表复制到另一个数据库的另一个时态表中。Azure 数据工厂是否支持时态表之间的数据同步?

在具有相同时态表的两个数据库之间同步数据的最佳方式是什么?

4

2 回答 2

1

我在我的 Azure SQL 数据库中创建了一个系统版本化(临时)表,遵循本文档创建一个临时表

CREATE TABLE Department   
(    
     DeptID int NOT NULL PRIMARY KEY CLUSTERED  
   , DeptName varchar(50) NOT NULL  
   , ManagerID INT  NULL  
   , ParentDeptID int NULL  
   , SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL  
   , SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL  
   , PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime)     
)   
WITH    
   (   
      SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory)   
   )   
;

我在不同的 Azure SQL Server 中创建了两个临时表 Department 和 Department2。

我在数据工厂副本活动中测试,选择部门作为源数据集,我们可以从设置中看到时态表: 在此处输入图像描述

选择 Department2 作为链接数据集,表映射:: 在此处输入图像描述

列映射: 在此处输入图像描述

主动运行成功: 在此处输入图像描述

这意味着 Azure 数据工厂支持将数据从一个时态表复制到另一个数据库的另一个时态表。

更新:

请参考此文档:SQL Server 2016 中的临时表 – 第 III 部分

现在,从 INSERT 开始,请记住在声明为 GENERATED ALWAYS AS ROW START / END 的临时表中有两个 datetime2 特殊列。这些是 PERIOD 列,它们是强制性的,但您不能将显式值插入 GENERATED ALWAYS 列。它的值将被自动填充。当您在表中插入新行时,“ROW START”列将具有 SYSUTCDATETIME() 的值(是的,不要忘记它是 UTC 时间!)并且“ROW END”列将具有值:'9999 -12-31 23:59:59.9999999' 基本上在临时表中插入新行时,关于这两列,您可以使用以下选项: 1. 使用列列表并省略这两列;2. 使用列列表而不省略这两列,并在每个列的值列表中指定 DEFAULT。3.

恭喜,错误已自行解决:

  1. 关闭目标表上的版本控制后加载表并且它工作。

ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = OFF); ALTER TABLE [dbo].[Department] DROP PERIOD FOR SYSTEM_TIME;

  1. 然后在复制活动完成后,将其切换回来。
ALTER TABLE [dbo].[Department] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime); ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = ON);

希望这可以帮助。

于 2019-07-03T07:01:49.040 回答
1

听起来这个线程得到了它需要的答案,但是对于未来的搜索...... Azure SQL 数据库中的 Azure SQL 数据同步确实支持同步时态表。

您只需要记住不要同步系统生成的日期列(因为您不能显式插入这些列,并且数据同步会尝试:-))

https://docs.microsoft.com/en-us/azure/sql-database/sql-database-sync-data#sync-req-lim

高温高压

于 2019-12-10T00:21:21.713 回答