繁体   English   中英

SQL Server:根据应用程序用户记录数据库更改

[英]SQL Server: Logging database changes based on application user

我想完成以下操作:当用户“ 123”登录到应用程序,然后对数据库中的数据进行更改时,此更改将记录到镜像表中,并在额外的列中添加“ 123”。

想法是编写一个在镜像表中保存“插入”或“删除”的触发器,但是问题是应用程序始终使用同一数据库用户,因此我需要以某种方式将应用程序用户与数据库连接。

所以我的想法是当用户登录到应用程序时,将应用程序用户的@@ SPID保存到表中。 不幸的是,我发现即使使用相同的ADOConnection类,每个查询的@@ SPID也会有所不同。

我也不能使用应用程序名称或主机名,因为可能是同一服务器上的不同用户启动了同一应用程序,并且我需要能够区分第一个用户所做的更改与第二个用户所做的更改。

该应用程序非常大,因此现在无法选择更新每个查询以手动记录更改。

还有其他解决方案吗?

最好的方法是捕获每个表中与修改/插入/删除记录有关的用户信息。 当用户更改记录时,将其详细信息(例如ID)更新到“ LastModifiedBy”一列中。 这应该解决捕获用户信息的问题。-因为我看不到任何其他可能的方式

审核日志记录的简单解决方案是在数据库表上启用SQL Change Data Capture。 它将负责将审核信息记录到由它创建的系统表中。 但请注意,疾病预防控制中心有一个保留期,通常为3天。 因此,每三天将从CDC表中清除一次数据。 您可能想探索禁用清理的机会,以便可以将信息永久存储在CDC表中,或者只需编写.Net Windows服务或SSIS包即可从CDC表中提取信息并推送到另一个Audit数据库。

我实际上现在自己找到了一个解决方案:使用host_process_id。

基本上,当应用程序用户登录时,您可以将其连接到dm_exec_sessions系统表中的host_process_id。 然后,当触发器运行时,您可以从@@ SPID获取host_process_id,以找出进行更改的用户。

即使@@ SPID更改,host_process_id仍保持不变,但是当同一应用程序在同一服务器上运行两次时,其值将不同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM