问题标签 [temporal-tables]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1429 浏览

sql-server - 时态历史表中的重复项

我们已经JCC将抽取的数据从 馈送OracleSQL Server 2016。由于一些未知的原因,历史表中存在具有相同开始和结束时间的重复项。怎么会发生?我试图用条件更新记录SET Column = Column。在那种情况下,我有 2 条记录,其中所有字段都相同,但开始时间和结束时间不同。有相同的日期时间怎么会发生?

更新在此处输入图像描述

DDL:

更新 2

我无法提供真实数据,但这是我用来获取重复数据的查询。请注意,我是按表中的所有列分组的,所以这些是明确的重复项:

在此处输入图像描述

更新 3:好的,此时这是我能够获得的新信息。我们试图捕捉rpc_completed事件以了解实际发生的情况。跟踪文件有 7 个不同的语句,event_sequence编号不同。据我了解,这意味着这些语句是在不同的事务中执行的。稍后我将尝试准备更详细的更新,但现在语句如下(除了最后一个语句之外的所有语句都是使用sp_prepexec存储过程执行的):

该行实际上有 3 种不同的状态,我们称它们为x,y,z

  • 带有状态的 PK 更新记录x——此时数据库中没有这样的记录
  • 带有状态的 PK 更新记录y——此时数据库中没有这样的记录
  • 插入带x状态的记录
  • INSERT 带有y状态的记录——这因违反 PK 约束而失败
  • 更新记录到x状态——实际上没有改变任何行,所以实际记录没有改变
  • 将记录更新到y状态——实际记录已更改
  • UPDATE 使用过程记录到z状态sp_execute,其中 handle_id 与上一次更新(更新到z状态)相同,但通过参数传递的值不同

所以在这些操作结束时,我们有:

原始表处于z状态,历史表有类似的东西(日期时间是真实值):

  • x状态栏,2017-11-01 16:55:31.3358248, 2017-11-01 16:55:31.3358248
  • x状态栏,2017-11-01 16:55:31.3358248, 2017-11-01 16:55:31.3358248
  • y状态栏,2017-11-01 16:55:31.3358248, 2017-11-01 16:55:41.9296659
0 投票
1 回答
573 浏览

sql - SQL Server 时态表创建重复记录

我在我们的一个经常更新的生产表上实现了一个系统版本化(临时)表。此表由应用程序、高级用户(手动使用自定义脚本和标准化存储过程)和系统作业更新。

我刚刚遇到一种情况,我看到一条新记录插入到历史记录表中,但它看起来与之前的记录完全相同。当我对此进行研究时,我发现这不是一次性的情况。还有很多。请记住,开始和结束日期不重复。上一条记录的结束日期与下一条记录的开始日期匹配,所有其他数据完全相同。

如果可能的话,我想防止这种情况发生,但首先我需要知道这是从哪里来的。

有没有人遇到过这种情况?有没有人足够了解临时表,可以为我提供一些潜在线索,说明什么可能会触发插入历史表而不对数据进行可见更改?是否可以在不更改用户可见字段的情况下更改记录?

提前致谢。

0 投票
2 回答
127 浏览

sql-server - 将 SYSTEM_TIME 列从 DATETIME2(7) 缩小到 DATETIME2(3) 的脚本

对于数据库中的所有临时表,我寻找一个生成 T-SQL 的脚本,以将它们的 SYSTEM_TIME 列从 DATETIME2(7) 缩小到 DATETIME2(3)。

我的理由:当表通过 ODBC 连接链接时,我希望能够从 MS Access 数据库中更新这些表。通过 ODBC 驱动程序链接时, Access 不支持DATETIME2(7)更新(该字段太大)。反之,SQL Server Native Client驱动就可以了(估计没试过);但它不支持Active Directory - 集成连接。此外,我的应用程序不需要这些字段的额外精度。

生成的代码将如下所示。只是好奇是否有人可能有这样的脚本?

0 投票
1 回答
525 浏览

c# - 用于从时态表中获取历史数据的实体框架 SQL 查询字符串引发数据表不兼容错误

我在这个问题中解释了同样的问题。

Matt在同一篇文章中找到了一个很好的答案,这对我很有帮助。它适用于插入和更新查询。我正在使用 IDbCommandTreeInterceptor 和 Ignored ValidFrom 和 ValidTo 列。

现在我正在尝试查询一些历史数据。由于 Entity Framework Linq 查询无法从时态表中获取数据,我不得不使用 SQL 查询字符串。

此行在运行时引发错误。

马特在他的回答中为插入和更新命令设置了条款。我尝试使用 DbQueryCommandTree 为查询设置相同的子句,但 DbQueryCommandTree 没有 SetClauses 命令。

任何帮助将不胜感激。

0 投票
0 回答
85 浏览

oracle - 具有时间性质的 Oracle 表中的粗操作

我正在实现 api 来插入、更新和删除 oracle 表中的数据。表有 valid_from 和 Valid_to(时间性质)列。表中不会有硬删除。只有在保存/更新/删除的情况下才会插入记录。每次只会填充 valid_to 日期。我有 2 张桌子,比如客户和联系人。

将clientId保存为联系人表中的外键或者我应该将关联存储在链接表中的更好方法是什么?

任何人都可以分享他们使用valid_from和valid_to列在表中存储和读取数据的经验。我正在寻找的是一种通过 api 存储这些数据并通过 api 读取信息的方法。如果需要任何其他详细信息,请告诉我。提前致谢。

0 投票
2 回答
1416 浏览

sql - Sql 2016 - 如何在系统版本化的时态表中仅获取已修改的列

如何在系统版本化的时态表中仅获取已修改的列。

我正在使用 SQL 2016 系统版本的时态表来跟踪更改。我的历史表填充了多行,其中包括每个版本的行编辑的修改和未修改的列。

有没有办法从历史行数据中只获取修改后的列值。

感谢您的回复。

谢谢

阿卜杜勒

0 投票
3 回答
883 浏览

c# - NHibernate HQL 生成器支持 SQL Server 2016 时态表

我正在尝试在 NHibernate 4.x 中实现对 SQL Server 2016 时态表的基本支持。这个想法是改变SQL语句

您可以在此处找到有关 SQL Server 2016 中时态表的更多信息

不幸的是,我还没有找到FOR FOR SYSTEM_TIME AS OF '...'在表名和它的别名之间插入语句的任何方法。我不确定自定义方言是否支持这一点。我现在唯一可行的解​​决方案是FOR SYSTEM_TIME在 extra 中附加语句WHERE,我的输出 SQL 看起来像这样

为此,我实现了生成器和方言,如下所示:

谁能提供任何更好的方法或示例,我可以用来FOR SYSTEM_TIME AS OF在表名及其别名之间向前移动和插入语句?目前我能看到的唯一解决方案是在其中更改 SQL,OnPrepareStatementSessionInterceptor我相信有一些更好的方法......

0 投票
1 回答
365 浏览

sql-server - SQL Server - 临时表 - 存储成本

网络中是否有任何信息,我可以在其中验证临时表功能的存储成本有多高?

服务器会创建被修改的行/元组的完整硬拷贝吗?或者服务器是否会使用未修改的主表原始值的引用/链接?

例如。我有一行 10 列 = 存储 100 KB。我更改了该行的一个值,两次。更改后,我在历史表中有几行。主表和历史表的填充存储成本是否约为 300KB?

感谢您的每一个提示!

拉加兹

0 投票
1 回答
48 浏览

sql-server - 删除重复间隔/历史重复

为该问题设置正确的标题有点挑战,因此我将尝试解释该问题。我们使用JCC进行Oracle --> SQL Server复制。它的工作方式是读取 Oracle 中的事务日志,然后在每次更改时发送 2 个语句:INSERT + UPDATE。因此,如果没有这样的记录,如果SQL Server中的记录已经存在,它将被插入,所以第一次INSERT将因为PK冲突而失败,然后它会尝试UPDATE记录。

现在我们正在尝试使用SQL Server 时态表进行历史跟踪。当JCC(复制)失败时问题就开始了,因为我们需要重新播放日志。例如,复制在上午 11:01 失败。为了确保我们不会错过任何记录,我们需要重播,例如从上午 10:45 开始。它适用于普通表,但是当我们处理临时表时,它只会使历史变得错误并且历史变得不准确。

所以,现在的问题。如何识别这些记录并清理它们?

在此处输入图像描述

预期成绩: 在此处输入图像描述

0 投票
1 回答
985 浏览

sql - 时态表中的日期函数

从 SQL Server 2016 开始,可以自动创建临时表。我想创建一个简单的查询来检索指定日期的数据。但是,当我尝试像这样在查询中指定日期时,会出现语法错误:

我什至尝试将数据类型转换为 datetime2,因为日期是这样存储的,但它仍然不起作用:

出现此问题,但是当我第一次执行SELECT GETDATE()然后复制文本并将其粘贴到查询中时,它工作正常。如何使用 AS OF 关键字指定日期时间?

提前致谢。