SQL 服务器中临时表之间的数据同步
Data sync between temporal tables in SQL Server
我想在两个具有系统版本(临时)table的数据库之间同步数据。 Azure 中的数据同步选项不支持时间 tables,我需要找到另一种在数据库之间进行同步的方法。
我想使用 Azure 数据将数据从一个时间 table 复制到另一个数据库的另一个时间 table factory.Will Azure 数据工厂支持时间 [=18] 之间的数据同步=]s?
在具有相同 tables 的两个数据库之间同步数据的最佳方式是什么?
我在我的 Azure SQL 数据库中创建了一个 system-versioned(temporal) table 遵循此文档 Creating a temporal table:
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 服务器中创建了两个临时的 tables Department 和 Department2。
我在数据工厂复制活动中测试,选择部门作为源数据集,我们可以从设置中看到时间table:
选择 Department2 作为 link 数据集,Table 映射::
列映射:
活动运行成功:
这意味着 Azure 数据工厂支持将数据从一个时间 table 复制到另一个数据库的另一个时间 table。
更新:
请参考此文档:Temporal Tables in SQL Server 2016 – Part III。
现在,从 INSERT 开始,请记住在时间 table 中有两个 datetime2 特殊列声明为 GENERATED ALWAYS AS ROW START / END。
这些是 PERIOD 列,它们是强制性的,但您不能将显式值插入 GENERATED ALWAYS 列。它的值将自动填充。
当您在 table 中插入新行时,“ROW START”列的值为 SYSUTCDATETIME()(是的,不要忘记它是 UTC 时间!),“ROW END”列的值为值:'9999-12-31 23:59:59.9999999'
基本上在时间 table 中插入新行时,对于这两列,您可以使用以下选项:
1.使用列列表,省略这两列;
2. 在不省略这两列的情况下使用列列表,并在每个列的值列表中指定 DEFAULT。
3. 不要使用列列表并在每个列的值列表中指定 DEFAULT。
恭喜,错误已自行解决:
- Loading the tables after switching off the versioning on the destination table and it worked.
ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = OFF); ALTER TABLE [dbo].[Department] DROP PERIOD FOR SYSTEM_TIME;
- Then after the copy active done, switch it back.
ALTER TABLE [dbo].[Department] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime); ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = ON);
希望对您有所帮助。
听起来这个线程得到了它需要的答案,但对于未来的搜索...... Azure SQL Azure SQL 数据库中的数据同步 确实 支持同步临时表。
您只需要记住不要同步系统生成的日期列(因为您不能显式插入到这些列中,数据同步会尝试:-))
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-sync-data#sync-req-lim
HTH
我想在两个具有系统版本(临时)table的数据库之间同步数据。 Azure 中的数据同步选项不支持时间 tables,我需要找到另一种在数据库之间进行同步的方法。
我想使用 Azure 数据将数据从一个时间 table 复制到另一个数据库的另一个时间 table factory.Will Azure 数据工厂支持时间 [=18] 之间的数据同步=]s?
在具有相同 tables 的两个数据库之间同步数据的最佳方式是什么?
我在我的 Azure SQL 数据库中创建了一个 system-versioned(temporal) table 遵循此文档 Creating a temporal table:
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 服务器中创建了两个临时的 tables Department 和 Department2。
我在数据工厂复制活动中测试,选择部门作为源数据集,我们可以从设置中看到时间table:
选择 Department2 作为 link 数据集,Table 映射::
列映射:
活动运行成功:
这意味着 Azure 数据工厂支持将数据从一个时间 table 复制到另一个数据库的另一个时间 table。
更新:
请参考此文档:Temporal Tables in SQL Server 2016 – Part III。
现在,从 INSERT 开始,请记住在时间 table 中有两个 datetime2 特殊列声明为 GENERATED ALWAYS AS ROW START / END。 这些是 PERIOD 列,它们是强制性的,但您不能将显式值插入 GENERATED ALWAYS 列。它的值将自动填充。 当您在 table 中插入新行时,“ROW START”列的值为 SYSUTCDATETIME()(是的,不要忘记它是 UTC 时间!),“ROW END”列的值为值:'9999-12-31 23:59:59.9999999' 基本上在时间 table 中插入新行时,对于这两列,您可以使用以下选项: 1.使用列列表,省略这两列; 2. 在不省略这两列的情况下使用列列表,并在每个列的值列表中指定 DEFAULT。 3. 不要使用列列表并在每个列的值列表中指定 DEFAULT。
恭喜,错误已自行解决:
- Loading the tables after switching off the versioning on the destination table and it worked.
ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = OFF); ALTER TABLE [dbo].[Department] DROP PERIOD FOR SYSTEM_TIME;
- Then after the copy active done, switch it back.
ALTER TABLE [dbo].[Department] ADD PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime); ALTER TABLE [dbo].[Department] SET(SYSTEM_VERSIONING = ON);
希望对您有所帮助。
听起来这个线程得到了它需要的答案,但对于未来的搜索...... Azure SQL Azure SQL 数据库中的数据同步 确实 支持同步临时表。
您只需要记住不要同步系统生成的日期列(因为您不能显式插入到这些列中,数据同步会尝试:-))
https://docs.microsoft.com/en-us/azure/sql-database/sql-database-sync-data#sync-req-lim
HTH