Jer*_*ore 9 trigger sql-server audit azure-sql-database users
背景资料:
SYSTEM_USER
在触发器中调用时,结果总是相同的。UserId
每次完成 DML 时都会为其提供一个字符串(仅在存储过程中完成)。我遇到的问题是,当用户删除记录时,我想知道是谁做的。因为它将通过相同的登录完成,我不想看到所有操作都是由服务完成的,我想看看是哪个用户完成的。这不是更新的问题,因为我们有ModifiedBy
将通过发送的UserId
更新来更新的列。
问题是:有没有办法在SYSTEM_USER
运行删除时设置或以其他方式将用户信息放入触发器中?
我现在拥有的“最佳”想法,虽然我不确定这是否是一个好主意,但在服务中,我检查当前UserId
是否以用户身份存在于数据库中,如果没有,则创建一个用户为他们反对。然后运行存储过程EXECUTE AS User = @UserId
。然后当 DML 在存储过程中完成并且触发器触发时,SYSTEM_USER
应该从EXECUTE AS
.
虽然使用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 一次用于多件事情。
归档时间: |
|
查看次数: |
8999 次 |
最近记录: |