我想在两个具有系统版本(时间)表的数据库之间同步数据。 Azure中的数据同步选项不支持时态表,我需要找到另一种在数据库之间进行同步的方法。
我想使用Azure数据工厂将数据从一个临时表复制到另一个数据库的另一个临时表中.Azure数据工厂是否支持临时表之间的数据同步?
在具有相同时间表的两个数据库之间同步数据的最佳方法是什么?
答案 0 :(得分:1)
我遵循此文档Creating a temporal table在我的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。
我测试了在Data Factory副本中处于活动状态,选择Department作为源数据集,我们可以从设置中看到时态表:
这意味着Azure数据工厂支持将数据从一个时态表复制到另一个数据库的另一时态表。
更新:
请参考此文档:Temporal Tables in SQL Server 2016 – Part III。
现在,从INSERT开始,请记住时态表中有两个datetime2特殊列,它们声明为GENERATED ALWAYS AS ROW START / END。 这些是“ PERIOD”列,它们是必需的,但是您不能在GENERATED ALWAYS列中插入显式值。其值将自动填充。 当您在表格中插入新行时,“ ROW START”列将具有SYSUTCDATETIME()的值(是的,不要忘记它是UTC时间!),而“ ROW END”列将具有值:'9999 -12-31 23:59:59.9999999' 基本上,在时态表中针对这两列插入新行时,可以使用以下选项: 1.使用列列表,并省略这两列; 2.使用列列表,而不忽略这两列,并在每列的值列表中指定DEFAULT。 3.不要使用列列表,而是在每个值列表中指定DEFAULT。
恭喜,错误已由您自己解决:
- 在关闭目标表的版本控制后加载表,并且可以正常工作。
ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = OFF); ALTER TABLE [dbo].[Department] DROP PERIOD FOR SYSTEM_TIME;
- 复制活动完成后,将其切换回去。
ALTER TABLE [dbo].[Department] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime); ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = ON);
希望这会有所帮助。
答案 1 :(得分:0)
听起来好像该线程已获得所需的答案,但对于将来的搜索... Azure SQL数据库中的Azure SQL数据同步确实支持同步时态表。
您只需要记住不要同步系统生成的日期列(因为您不能将INSERT显式插入到这些列中,并且Data Sync会尝试:-))
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-sync-data#sync-req-lim
HTH