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

Posted

技术标签:

【中文标题】SQL Server:根据应用程序用户记录数据库更改【英文标题】:SQL Server: Logging database changes based on application user 【发布时间】:2017-11-02 07:57:07 【问题描述】:

我想实现这一点,当用户“123”登录应用程序然后对数据库中的数据进行更改时,此更改将被记录到镜像表中,并在额外的列中显示“123”。

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

所以我的想法是在用户登录应用程序时将应用程序用户的@@SPID 保存到一个表中。不幸的是,我认为@@SPID 对于每个查询都可能不同,即使我使用相同的 ADOConnection 类。

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

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

这个问题还有其他解决方案吗?

【问题讨论】:

类似于***.com/questions/648166/… 您的用户是域用户吗?您想知道使用 SQL Server 登录(通过您的应用程序)登录服务器的用户的域帐户吗? 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

其实我现在自己找到了解决方案:使用 host_process_id。

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

即使@@SPID 发生变化,host_process_id 保持不变,但当同一个应用程序在同一台服务器上运行两次时,它的值会有所不同。

【讨论】:

以上是关于SQL Server:根据应用程序用户记录数据库更改的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server游标

SQL Server基础之游标

SQL Server:如何根据最近的日期时间检索所有记录

SQL Server 查询以查找间隔或 12 个月或更长时间的记录

SQL Server:CASE 语句中的 OR 语句

如何在SQL Server中使用用户定义的表类型插入数据时避免重复记录