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

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是实际删除该行的人。如何捕获删除记录的用户?我在这里有哪些选择?

IIT*_*ITC 1

正如您正确地提到的,系统的行为符合预期,即历史表根据系统时间存储临时表中的最新行(完整行)(通过传输)(参考:https: //learn.microsoft .com/en-us/sql/relational-databases/tables/temporal-tables?view=sql-server-ver15)。但是,您似乎想在发生此类传输事务之前覆盖 ModifiedBy Column 中的值。由于这违反了审计的核心原则(每笔交易的内容、时间和人员),因此系统不允许这种情况发生是正确的。

建议更改上下文中的原始表,以增加一列来映射当前用户 ID(参考:默认登录用户到 SQL Server 列)。这可以通过更改数据库本身的表结构或修改 EF 代码以添加新列并存储当前用户来实现。

  • 在删除之前立即修改记录不会违反审核,此时用户 _X_ 正在对该行进行更改,记录这一事实正是审核日志应该做的。之前的值仍然保留在之前的日志中,因此在这种情况下我们没有污染任何内容。 (2认同)