LP1*_*P13 8 t-sql sql-server temporal-tables ef-core-2.2
我知道时态表旨在为您提供数据的时间点视图。我正在使用时态表进行审计。我有以下临时表。
让我们假设这是临时表的当前状态:
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
是实际删除该行的人。如何捕获删除记录的用户?我在这里有哪些选择?
正如您正确地提到的,系统的行为符合预期,即历史表根据系统时间存储临时表中的最新行(完整行)(通过传输)(参考:https: //learn.microsoft .com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15)。但是,您似乎想在发生此类传输事务之前覆盖 ModifiedBy Column 中的值。由于这违反了审计的核心原则(每笔交易的内容、时间和人员),因此系统不允许这种情况发生是正确的。
建议更改上下文中的原始表,以增加一列来映射当前用户 ID(参考:默认登录用户到 SQL Server 列)。这可以通过更改数据库本身的表结构或修改 EF 代码以添加新列并存储当前用户来实现。