SQL 服务器:根据应用程序用户记录数据库更改
SQL Server: Logging database changes based on application user
我想实现的是,当用户“123”登录到应用程序然后对数据库中的数据进行更改时,此更改将被记录到镜像 table 中,其中包含“123”额外的列。
本来的想法是写一个触发器在镜像table中保存"inserted"或"deleted",但问题是应用程序总是使用相同的数据库用户,所以我需要以某种方式将应用程序用户与数据库连接起来。
所以我的想法是在用户登录应用程序时将@@SPID 与应用程序用户一起保存到 table 中。不幸的是,我认为每个查询的 @@SPID 都可能不同,即使我使用相同的 ADOConnection class.
我也不能使用应用程序名称或主机名,因为同一服务器上的不同用户可能会启动相同的应用程序,我需要能够区分第一个用户所做的更改和第二个用户所做的更改第二个用户做了。
应用程序非常大,因此更新每个查询以手动记录更改现在不是一个选项。
这个问题还有其他解决方案吗?
最好的方法是在每个 table 中捕获关于记录 modified/inserted/deleted 的用户信息。当用户更改记录时,将他的详细信息(如 ID)更新到 'LastModifiedBy' 等列中。这应该可以解决捕获用户信息的问题。-- 因为我没有看到任何其他可能的方法
审核日志记录的简单解决方案是在您的数据库table 上启用SQL 更改数据捕获。它将负责将审计信息记录到它创建的系统 table 中。但请注意,CDC 有保留期,通常为 3 天。因此,每三天就会从 CDC tables 中擦除数据。您可能想探索一个禁用清理的机会,以便您可以将信息永久存储在 CDC tables 中,或者简单地编写一个 .Net windows 服务或一个 SSIS 包来从 CDC tables 并推送到另一个审计数据库。
其实我现在自己找到了解决办法:使用host_process_id.
基本上当应用程序用户登录时,您可以将他连接到dm_exec_sessions系统table中的host_process_id。然后当触发器运行时,您可以从@@SPID 获取 host_process_id 以找出哪个用户进行了更改。
即使@@SPID改变,host_process_id保持不变,但当同一个应用程序在同一台服务器上运行两次时,它具有不同的值。
我想实现的是,当用户“123”登录到应用程序然后对数据库中的数据进行更改时,此更改将被记录到镜像 table 中,其中包含“123”额外的列。
本来的想法是写一个触发器在镜像table中保存"inserted"或"deleted",但问题是应用程序总是使用相同的数据库用户,所以我需要以某种方式将应用程序用户与数据库连接起来。
所以我的想法是在用户登录应用程序时将@@SPID 与应用程序用户一起保存到 table 中。不幸的是,我认为每个查询的 @@SPID 都可能不同,即使我使用相同的 ADOConnection class.
我也不能使用应用程序名称或主机名,因为同一服务器上的不同用户可能会启动相同的应用程序,我需要能够区分第一个用户所做的更改和第二个用户所做的更改第二个用户做了。
应用程序非常大,因此更新每个查询以手动记录更改现在不是一个选项。
这个问题还有其他解决方案吗?
最好的方法是在每个 table 中捕获关于记录 modified/inserted/deleted 的用户信息。当用户更改记录时,将他的详细信息(如 ID)更新到 'LastModifiedBy' 等列中。这应该可以解决捕获用户信息的问题。-- 因为我没有看到任何其他可能的方法
审核日志记录的简单解决方案是在您的数据库table 上启用SQL 更改数据捕获。它将负责将审计信息记录到它创建的系统 table 中。但请注意,CDC 有保留期,通常为 3 天。因此,每三天就会从 CDC tables 中擦除数据。您可能想探索一个禁用清理的机会,以便您可以将信息永久存储在 CDC tables 中,或者简单地编写一个 .Net windows 服务或一个 SSIS 包来从 CDC tables 并推送到另一个审计数据库。
其实我现在自己找到了解决办法:使用host_process_id.
基本上当应用程序用户登录时,您可以将他连接到dm_exec_sessions系统table中的host_process_id。然后当触发器运行时,您可以从@@SPID 获取 host_process_id 以找出哪个用户进行了更改。
即使@@SPID改变,host_process_id保持不变,但当同一个应用程序在同一台服务器上运行两次时,它具有不同的值。