如何在 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 中跟踪和更新增量表的上次修改日期?