假设您具有以下内容...一个ASP.NET Web应用程序,它调用存储过程来删除记录。该表上有一个触发器,每次删除记录时都会插入一个审计条目。我希望能够在审计条目中记录谁删除了记录的用户名。实现这一目标的最佳方式是什么?我知道我可以删除触发器并让删除存储过程在删除之前插入审核条目但是还有其他推荐的替代方法吗?
如果用户名作为参数传递给删除存储过程,那么无论如何都要在删除记录时在触发器中获取此值?我只是把它扔到那里......
答案 0 :(得分:2)
触发器上下文可以访问当前用户,如SQL Server所见(即ASP用来连接到SQL的用户):USER_NAME()
。
如果在调用SQL时没有模仿Web用户,那么通常的技巧是在会话上下文中设置当前用户,触发器代码可以从中查找,请参阅Using Session Context Information。< / p>
答案 1 :(得分:2)
使用触发器的优点是您可以确定它是通用的 - 对表的任何修改都将被审核。就如何与触发器进行通信而言,您可以使用表格中的字段,例如“LastModifiedBy”。触发器本身可以在执行时清除该字段,这样如果在没有设置字段的情况下发生更新,则审计表将检测到未提供用户。
答案 2 :(得分:2)
答案 3 :(得分:0)
让您的应用程序传递删除器的用户名。
在你删除的sproc中:
UPDATE Customer
SET DeletedBy = @DeletedBy
WHERE ID = @ID
在触发器中,使用相同的值:
INSERT INTO MyDeletedLog (ID, DeletedBy)