问题标签 [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 投票
1 回答
1036 浏览

sql-server - 视图中的系统版本化(临时)表

我有许多加入的“系统版本化”表,例如 Person、PhoneNumber 和 EmailAddress 该 Person 一次只有一个 PhoneNumber 和一个 EmailAddress。

PhoneNumber 和 EmailAddress通常不会在一次更新所有 3 个的事务之外更新。(但它们可以独立更新,只是不能在正常情况下)例如,如果我更改电话号码,那么所有 3 条记录将在同一事务中发布更新,因此在历史记录中为它们提供相同的“开始时间”桌子。

假设我插入了一个人,然后在 2 次交易中更改了此人的姓名、电子邮件地址和电话号码:

现在我使用时间查询从视图中选择(只是表的内部连接):

而且每次编辑组合都会返回一行!

多行

如何查询此视图(如果可能的话)以仅返回 1 行用于在同一事务中进行的更新?
我可以添加一个 WHERE 子句来匹配所有 SysStartTimes,但是这将排除那些独立于其他 2 个表更新的情况。

0 投票
1 回答
112 浏览

sql-server - 子句之间的临时表 - 包含不应该包含的行?

我有一个 SQL Server 2016 时态表。我执行了一个可以在下面看到的查询以及结果。我很好奇为什么包含以绿色突出显示的行。ValidFrom 值出现在“2018 年 7 月 12 日 19:16:00”的开始日期之前,而 ValidTo 出现在“2018 年 7 月 12 日 19:30:00”的结束日期之后。

我对 BETWEEN / AND 的理解可能是不正确的,它会发现在两个时间点之间修改的所有行。

在此处输入图像描述

0 投票
0 回答
37 浏览

sql-server - 临时表 - 是否有内置方法来确定在一系列日期内已更改的行

临时表似乎没有提供一种内置方法来确定在一段时间内发生更改的所有行。BETWEEN 子句返回在一个日期范围内活动的所有行,但我正在寻找一种方法来确定在一个日期范围内发生变化的所有行。

0 投票
3 回答
1782 浏览

tsql - 如何复制时态表

我有一个临时表,我想使用事务复制来复制它。历史表不能有事务复制所需的主键。当我尝试复制当前表时,复制失败,因为它无法插入GENERATED ALWAYS AS ROW STARTGENERATED ALWAYS AS ROW END列。

0 投票
3 回答
2357 浏览

sql-server - 将列更改为非空,其中系统版本化列可以为空

我正在使用 SQL Server 和系统版本化(临时)表。在我的主表中,我有一INT列当前允许 NULL。我想将其更新为不允许空值,但表的系统/历史副本允许空值。

我运行这个语句:

我得到这个错误:

无法将值 NULL 插入列“MyInt”、表“mydb.dbo.MyTable_History”;列不允许空值。更新失败。

我使用这个脚本创建了系统版本表:

在这种情况下,有没有其他方法可以使我的主表的列不可为空?我想我可以(也许)用任意垃圾值手动更新现有的系统版本化的空值,但似乎这种情况应该支持临时表。

0 投票
1 回答
999 浏览

sql-server - 包含在(@start,@end)VS BETWEEN - 临时表中

Temporal Tables是 Temporal Tables 及更高版本中的一个新功能SQL Server 2016,它就像一种有趣的方式SQL Server来自动保存表中的数据历史记录,但是引入了一些新的 T-SQL 语法SQL Server 2016来支持 Temporal Tables。我对他们中的一些人有误解。

来自官方文档的描述BETWEEN <start_date_time> AND <end_date_time>如下:

与上面的 FOR SYSTEM_TIME FROM TO 描述相同,除了返回的行表包括在端点定义的上边界上变为活动的行。

并且描述CONTAINED IN (<start_date_time>, <end_date_time>)如下:-

返回一个表,其中包含在 CONTAINED IN 参数的两个日期时间值定义的指定时间范围内打开和关闭的所有行版本的值。包括恰好在下边界上变为活动或在上边界上停止活动的行。

CONTAINED IN (@start,@end)所以我明白, andBETWEEN子句之间的唯一不同CONTAINED IN (@start, @end)是包含@start 边界,而BETWEEN子句不是。我对吗?

0 投票
2 回答
1701 浏览

sql-server - SQL Server - 临时表 - 仅选定列

我最近从事的一个项目的要求之一是维护数据库表数据的历史记录,作为审计跟踪的一部分。我首先想到的技术解决方案是使用触发器,但经过一些研究后,我了解了 SQL Server 时态表(核心 SQL Server 2016 的一部分)。我围绕这个做了很多研究,发现临时表可以很好地利用。

有关时态表的更多信息:在 SQL Server 2016 中管理时态表历史记录

但是,我希望仅在更改少数列时创建临时表中的数据。

现在,如果我在此之上创建临时表(SYSTEM_VERSIONING = On),我希望仅在更改电话号码而不是名字和姓氏时才将数据插入临时表中。

0 投票
1 回答
800 浏览

sql-server - SQL Server 2017 中的时态表是否支持外键?

如果我尝试将外键添加到 Visual Studio 中的临时表,它无法解析对主表的引用。无论该表也是临时表还是不是临时表,都会发生这种情况。

文档说你不能在临时表的历史表中拥有外键......但他们并没有说你不能在临时表本身中拥有它们。

可能吗 ?

0 投票
3 回答
1790 浏览

sql-server-2016 - 使用 Entity Framework Core 2.1 插入时态表时出错

尝试使用 Entity Framework Core 2.1 插入时态表时出现以下错误。

无法将显式值插入表“db_test.dbo.Department”中的 GENERATED ALWAYS 列。将 INSERT 与列列表一起使用以排除 GENERATED ALWAYS 列,或将 DEFAULT 插入 GENERATED ALWAYS 列。

下面是我的表架构

我的DbContext样子是这样的:

请看一下,让我知道我们如何解决这个问题。我不喜欢修改 db 上下文类,因为我使用 DBScaffold 通过 nuget 控制台生成它,并且每次重新生成它时我都无法手动更新它。

0 投票
0 回答
549 浏览

sql - SQL Server 临时表 - 如何输入不是“现在”的行?

我正在开发一个系统,该系统将定期处理来自外部源的消息并将结果存储在我们的数据库中。特别是,它会收到诸如“患者 X 于 2018 年 10 月 22 日上午 09:45 移至位置 Y...”之类的消息。

理想情况下,我希望能够使用 SQL Server 的时态表来创建“患者去过哪里”的历史轨迹,这样我就可以查询他们在特定时间点的位置。

问题是 [DateStartedUtc] 只能填充当前系统时间,这不一定是患者位置更改的时间。

我的具体问题是: - 有没有一种好方法可以将新数据输入到临时表中,但用特定的开始日期标记它?([DateStartedUtc] 必须是“生成”吗?) - 如果不是,是否还有其他存储可查询历史表的最佳实践?

编辑添加: - Aaron 在评论中提醒我提到关闭和打开系统版本控制。我研究的一个潜在解决方案是关闭系统版本控制,在 dbo.PatientLocations 或 dbo.PatientLocations_History 中插入一个新行,然后重新打开系统版本控制(全部在事务中)。我认为这不是定期更新表格的好解决方案(并且需要我手动维护开始和结束日期),但我愿意被说服。

其他更新

为了添加更多上下文,我最初的解决方案(在我发现 Temporal Tables 之前)是使用触发器维护单个历史表:

我最初放弃了这个解决方案,因为触发器通常表现不佳。

认为Temporal Tables 可以优雅地解决我的问题,但正如评论所提到的,它们实际上只是为系统版本控制而设计的,而不是用户定义的版本控制。

所以我修改后的问题是: - 在数据库中存储和维护用户定义历史的最佳方式是什么?- 有没有比使用触发器更好的解决方案?或者有没有更有效的方法来使用触发器?