我试图在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) 我有一个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 Server本身的问题,但我想在这里发布它来确认。
尝试将不可为 NULL 的列的值设置为 NULL。
我正在使用 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
我有很多数据表,我想转换为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
我知道时态表旨在为您提供数据的时间点视图。我正在使用时态表进行审计。我有以下临时表。
让我们假设这是临时表的当前状态:
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是实际删除该行的人。如何捕获删除记录的用户?我在这里有哪些选择?
时态表比变更数据捕获或变更跟踪有什么优势?
sql-server change-tracking change-data-capture sql-server-2016 temporal-tables
从 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 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)
在这种情况下,有没有其他方法可以使我的主表的列不可为空?我想我可以(也许)使用任意垃圾值手动更新现有的系统版本控制空值,但似乎时态表应该支持这种情况。
我们使用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
创建时态表时,我们需要定义开始和结束日期时间列,这些列在或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)
为什么我不允许在此类列上添加此属性?
temporal-tables ×10
sql-server ×8
t-sql ×4
sql ×3
c# ×2
.net-core ×1
asp.net-core ×1
ef-core-2.2 ×1
nhibernate ×1
sql-merge ×1