标签: temporal-tables

NHibernate HQL Generator支持SQL Server 2016时态表

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

SELECT * FROM Table t0
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM Table FOR SYSTEM_TIME AS OF '2018-01-16 00:00:00' t0
Run Code Online (Sandbox Code Playgroud)

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

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

SELECT * FROM Table t0 WHERE FOR SYSTEM_TIME AS OF '2018-01-16 00:00:00'=1
Run Code Online (Sandbox Code Playgroud)

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

public static class AuditableExtensions
{
    public static bool AsOf(this IAuditable entity, DateTime date)
    {
        return true;
    }

    public static IQueryable<T> Query<T>(this ISession session, DateTime asOf) where T : …
Run Code Online (Sandbox Code Playgroud)

c# sql-server nhibernate sql-server-2016 temporal-tables

26
推荐指数
1
解决办法
599
查看次数

如何使用SQL Server时态表识别更改的值?

我有一个SQL Azure表,我已经打开了新的Temporal Table功能(SQL Server 2016和SQL Azure v12的新功能).此功能创建另一个表来跟踪主表的所有更改(我在问题的底部包含了关于时态表的文档的链接).您可以使用特殊查询语言来获取此历史记录.请注意以下查询中的FOR SYSTEM_TIME ALL:

SELECT 
    ValidFrom
    , ValidTo
    , ShiftId
    , TradeDate
    , StatusID
    , [LastActionDate]
    , [OwnerUserID]
    , [WorkerUserID]
    , [WorkerEmail]
    , [Archived]
FROM [KrisisShifts_ShiftTrade] 
FOR SYSTEM_TIME ALL
WHERE [ShiftID] = 27
ORDER BY ValidTo Desc
Run Code Online (Sandbox Code Playgroud)

结果集如下所示:

ValidFrom                   ValidTo                     ShiftId     TradeDate  StatusID    LastActionDate          OwnerUserID WorkerUserID WorkerEmail                                        Archived
--------------------------- --------------------------- ----------- ---------- ----------- ----------------------- ----------- ------------ -------------------------------------------------- --------
2017-06-21 00:26:44.51      9999-12-31 23:59:59.99      27          2017-01-27 3           2017-01-09 16:23:39.760 45          34           test@hotmail.com                                   1
2017-06-21 00:19:35.57 …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server azure-sql-database temporal-tables

14
推荐指数
2
解决办法
4977
查看次数

为什么合并到历史表中具有非聚集索引的时态表会引发错误

当我尝试在某些条件下合并时,出现以下错误。有人能够解释为什么吗?看起来这是SQL Server本身的问题,但我想在这里发布它来确认。

尝试将不可为 NULL 的列的值设置为 NULL。

  1. 目标表必须进行版本控制
  2. 历史表必须有非聚集索引
  3. 必须插入足够的记录。在下面的示例中,合并 2731 条记录失败,但合并 2730 条记录就好了

我正在使用 SQL Server 2017,但也在 Azure SQL 中观察到它

BEGIN TRANSACTION
SET XACT_ABORT ON;

CREATE TABLE RandomNumberHistory (Id INT NOT NULL, Number INT NOT NULL, [ValidFrom] DATETIME2 NOT NULL, [ValidTo] DATETIME2 NOT NULL);
CREATE TABLE RandomNumber (Id INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY, Number INT NOT NULL, 
    ValidFrom DATETIME2 GENERATED ALWAYS AS ROW START, 
    ValidTo DATETIME2 GENERATED ALWAYS AS ROW END, 
    PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
)
WITH …
Run Code Online (Sandbox Code Playgroud)

sql-server sql-merge azure-sql-database sql-server-2017 temporal-tables

10
推荐指数
1
解决办法
1078
查看次数

如何通过保存数据将存在表更改为SQL Temporal表?

我有很多数据表,我想转换为Microsoft Temporal表,但是当我想转换时态表导致丢失我的数据.我的代码是:

Alter TABLE dbo.Employee   
(    
  [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED   
  , [Name] nvarchar(100) NOT NULL  
  , [Position] varchar(100) NOT NULL   
  , [Department] varchar(100) NOT NULL  
  , [Address] nvarchar(1024) NOT NULL  
  , [AnnualSalary] decimal (10,2) NOT NULL  
  , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START  
  , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END  
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
 )    
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)); 
Run Code Online (Sandbox Code Playgroud)

如何通过保存数据将存在表改为Sql时态表?

sql sql-server temporal-database sql-server-2016 temporal-tables

8
推荐指数
3
解决办法
933
查看次数

捕获删除临时表中行的用户

我知道时态表旨在为您提供数据的时间点视图。我正在使用时态表进行审计。我有以下临时表。

让我们假设这是临时表的当前状态:

ID  RoleID  UserID      ModifiedBy
------------------------------------------
1   11      1001        foo@example.com
2   22      1001        foo@example.com
3   33      1002        bar@example.com
4   11      1003        foo@example.com
Run Code Online (Sandbox Code Playgroud)

我有一个使用 EF Core 的 Web 应用程序。我的 EF 代码总是将 设置ModifiedBy为当前登录的用户。我以身份登录应用程序bar@example.com并删除了 ID 为 2 的记录。SQL Server 将按预期自动将删除的记录插入历史记录表中,并保持 ModifiedBy 为,foo@example.com因为这是 ModifiedBy 列的时间点值。

但是现在系统不知道是谁删除了该行。在这种情况下,bar@example.com是实际删除该行的人。如何捕获删除记录的用户?我在这里有哪些选择?

t-sql sql-server temporal-tables ef-core-2.2

8
推荐指数
1
解决办法
388
查看次数


时态表中的日期函数

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

SELECT * FROM Person FOR SYSTEM_TIME AS OF GETDATE()
Run Code Online (Sandbox Code Playgroud)

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

SELECT * FROM Person FOR SYSTEM_TIME AS OF CONVERT(datetime2,GETDATE())
Run Code Online (Sandbox Code Playgroud)

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

提前致谢。

sql t-sql sql-server-2016 temporal-tables

7
推荐指数
1
解决办法
1750
查看次数

在系统版本列可以为空的情况下,将列更改为非空

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

我运行这个语句:

ALTER TABLE dbo.MyTable 
    ALTER COLUMN MyInt INT NOT NULL;
Run Code Online (Sandbox Code Playgroud)

我得到这个错误:

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

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

ALTER TABLE dbo.MyTable
    ADD 
        ValidFrom DATETIME2 (2) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT DFMyTable_ValidFrom DEFAULT DATEADD(SECOND, -1, SYSUTCDATETIME()),
        ValidTo DATETIME2 (2) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DFMyTable_ValidTo DEFAULT '9999.12.31 23:59:59.99',
        PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo);

ALTER TABLE dbo.MyTable 
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.MyTable_History));
GO
Run Code Online (Sandbox Code Playgroud)

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

sql-server temporal-tables

6
推荐指数
1
解决办法
1794
查看次数

entityframework核心和sql 2016时态表

我们使用efcore和sql 2016作为我们的.net核心web api.我正在评估时态表的使用及其对efcore代码的影响.当我使用cmd行生成ef模型时,它会在dbcontext中使用appstart,append和mappings生成模型.当我插入/更新时,他们无法说这些列无法更新.我不得不删除appstart,从模型和dbcontext映射结束以使其工作.我读过ef6x等efcore中没有拦截功能.请为此建议更好的解决方案.

c# entity-framework-core .net-core asp.net-core temporal-tables

5
推荐指数
1
解决办法
2844
查看次数

如何在列上添加隐藏属性?

创建时态表时,我们需要定义开始和结束日期时间列,这些列在或hidden中不可见。我想再添加一列,其中包含有关已提交更改的用户的信息。SELECT *INSERT without columns

问题是,我收到以下错误:

Msg 13735, Level 16, State 1, Line 10
Cannot alter HIDDEN attribute on column 'UserID' in table 'GK' because this column is not a generated always column.
Run Code Online (Sandbox Code Playgroud)

这是代码:

DROP TABLE IF EXISTS GK;

CREATE TABLE GK
(
    [ID] INT
   ,[UserID] BIGINT DEFAULT (CONVERT(BIGINT, SESSION_CONTEXT(N'user_id')))  
)

ALTER TABLE GK
ALTER COLUMN [UserID] ADD HIDDEN;
Run Code Online (Sandbox Code Playgroud)

为什么我不允许在此类列上添加此属性?

t-sql sql-server sql-server-2016 temporal-tables

5
推荐指数
1
解决办法
1万
查看次数