使用共享登录时,如何知道用户对审计表执行删除操作?

Jer*_*ore 9 trigger sql-server audit azure-sql-database users

背景资料:

  • 我正在创建一组审计表,以跟踪我的应用程序对一组数据表的更新和删除。
  • 审计记录是通过触发器创建的。
  • 我的应用程序数据库中的 DML 通常来自服务用于进入数据库的登录名。因此,我认为SYSTEM_USER在触发器中调用时,结果总是相同的。
  • 我的应用程序当前不存储用户数据,尽管UserId每次完成 DML 时都会为其提供一个字符串(仅在存储过程中完成)。

我遇到的问题是,当用户删除记录时,我想知道是谁做的。因为它将通过相同的登录完成,我不想看到所有操作都是由服务完成的,我想看看是哪个用户完成的。这不是更新的问题,因为我们有ModifiedBy将通过发送的UserId更新来更新的列。

问题是:有没有办法在SYSTEM_USER运行删除时设置或以其他方式将用户信息放入触发器中?

我现在拥有的“最佳”想法,虽然我不确定这是否是一个好主意,但在服务中,我检查当前UserId是否以用户身份存在于数据库中,如果没有,则创建一个用户为他们反对。然后运行存储过程EXECUTE AS User = @UserId。然后当 DML 在存储过程中完成并且触发器触发时,SYSTEM_USER应该从EXECUTE AS.

RBa*_*ung 4

虽然使用EXECUTE AS User = @UserId可能是您的最佳选择(取决于其他问题),但这里有一种替代方法:

在您的存储过程中,或者在执行DELETE以下命令之前在 SQL 会话中的任何时间:

SET CONTEXT_INFO @UserId
Run Code Online (Sandbox Code Playgroud)

然后在你的触发器中你可以检索这个值

SELECT @var = CAST(CAST(CONTEXT_INFO() As Varbinary(4)) As Int)
Run Code Online (Sandbox Code Playgroud)

这有一些缺点,其中最重要的是您不能轻松地将 CONTEXT_INFO 一次用于多件事情。