【问题标题】:Auditing: How to write SQL user to a table WITHOUT a trigger审计:如何在没有触发器的情况下将 SYSTEM_USER 写入表
【发布时间】:2021-08-31 10:13:24
【问题描述】:

我正在尝试找到一种方法,以便在插入或更新记录时自动将 SYSTEM_USER 的值写入表中的列。

过去我使用 INSTEAD OF 触发器来实现这种事情,但我使用临时表来维护每条记录的审计历史记录,它们不允许使用触发器,所以选项已失效。

我还考虑在每个表中添加一个标识列并在应用层为此指定一个值,但是如果有人直接更新数据库(例如:通过 SQL)并且业务需求指定,这将失败必须处理这种情况。

在研究此问题并使用选项时,我尝试在表中使用计算字段,该字段在历史时态表上运行良好,但在“当前”表中,它始终返回查询用户的名称,而不是上次写入记录的用户。

有什么方法可以让数据库在写入时自动设置不涉及触发器的字段的值?

【问题讨论】:

  • 您仍然可以使用INSTEAD OF 触发器,只在表上的模式绑定视图上定义它,而不是在表本身上。您可能需要稍微调整权限以允许人们通过视图而不是表本身插入/更新,但我认为如果您仅授予 INSERT/UPDATE 视图权限,所有权链接应该会处理它而不是桌子。 (如果没有,EXECUTE AS 是必需的,那么您可能想要使用 ORIGINAL_LOGIN() 而不是 SYSTEM_USER。)

标签: sql-server entity-framework ddl temporal-tables


【解决方案1】:

也许你可以尝试使用默认值

create table #test (id int, name varchar(50), username varchar(50) default (system_user))

insert into #test (id, name) values (1, 'john'), (2, 'rambo')

select * from #test

在我的情况下,这会返回

id name  username
1  john  sa
2  rambo sa

【讨论】:

  • 这适用于插入,但不幸的是对更新没有帮助。如果另一个用户要更新该记录,则用户名的值将保持不变。
  • 是的,你是对的。出于某种原因,我在您的问题中错过了update 这个词
猜你喜欢
  • 1970-01-01
  • 2021-09-05
  • 2010-09-10
  • 2011-12-07
  • 2016-07-14
  • 2011-08-09
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多