如何在 SQL Server 中查找上次修改表的人?

Posted

技术标签:

【中文标题】如何在 SQL Server 中查找上次修改表的人?【英文标题】:How to find who last modified the table in SQL server? 【发布时间】:2015-04-23 21:19:33 【问题描述】:

我正在尝试查找上次修改 SQL Server 中特定表的用户。 sys.dm_db_index_usage_stats 提供有关表的最后修改日期的信息,但我正在寻找最后修改者。有没有办法找出最后修改特定表的登录名?

【问题讨论】:

表是用户直接修改还是通过存储过程修改的? 我正在尝试在表上创建一个插入、更新和删除触发器,以便如果有人尝试执行 DML 操作,它应该在日志表中插入 modified_date、modified_by、row_id 等信息。 在这种情况下,我认为您可以按照本文的建议执行以下操作:simple-talk.com/sql/database-administration/… 【参考方案1】:

我认为您必须启用 SQL Server 中的内置审核,默认情况下未启用,或者编写您自己的审核方法。

如果这是针对已经发生的事情,那么我认为你可能不走运。

【讨论】:

【参考方案2】:

试试这个,看看是否有帮助:

DECLARE @filename VARCHAR(255) 
SELECT @FileName = SUBSTRING(path, 0, LEN(path)-CHARINDEX('\', REVERSE(path))+1) + '\Log.trc'  
FROM sys.traces   
WHERE is_default = 1;  

SELECT gt.HostName, 
       gt.ApplicationName, 
       gt.NTUserName, 
       gt.NTDomainName, 
       gt.LoginName, 
       gt.SPID, 
       gt.EventClass, 
       te.Name AS EventName,
       gt.EventSubClass,      
       gt.TEXTData, 
       gt.StartTime, 
       gt.EndTime, 
       gt.ObjectName, 
       gt.DatabaseName, 
       gt.FileName, 
       gt.IsSystem
FROM [fn_trace_gettable](@filename, DEFAULT) gt 
JOIN sys.trace_events te ON gt.EventClass = te.trace_event_id 
WHERE EventClass in (164) 
ORDER BY StartTime DESC; 

【讨论】:

您正在使用默认跟踪,其中不包括谁修改了表中的行。 根据本文here,默认跟踪文件记录所有对象更改事件(我认为这将包括修改表中的一行)。 simple-talk.com/sql/performance/… 我相信这意味着谁更改了结构(更改表...)而不是谁添加了一行。你为什么不试试看,告诉我们你发现了什么。 @benjamin moskovits 我在发布之前尝试过这个,并在上个月创建的表格上看到了所有最近的事件。我想知道它是否会以同样的方式对 Rose 起作用。【参考方案3】:

感谢大家调查我的问题并提供建议。我在触发器中使用了以下脚本来获取 last_modified_by。

   DECLARE @login_name NVARCHAR(200)
   SELECT  @login_name = loginame
   FROM  sys.sysprocesses
   WHERE   spid = @@SPID

【讨论】:

以上是关于如何在 SQL Server 中查找上次修改表的人?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2016 - 临时表 - 如何识别用户

Hive - 如何在 Hive 中跟踪和更新增量表的上次修改日期?

SQL Server:如何在视图中查找未使用的字段

如何在 SQL Server 2008 R2 表中添加“上次更新”列?

SQL Server:如何查询上次事务日志备份的时间?

如何在 SQL Server 2012 中创建的临时表上查找索引列表