检查谁/何时更新SQL Server中的列

时间:2019-04-09 12:52:05

标签: sql-server

我真的很难回答我的同事这个​​问题,有时我们在表上进行了更改,我们不知道更改了谁或何时更改,我有此查询,但有时并不太准确。

SELECT OBJECT_NAME(OBJECT_ID) AS DatabaseName, last_user_update,*
FROM sys.dm_db_index_usage_stats
WHERE database_id = DB_ID( 'MYDB') --DB Name
AND OBJECT_ID=OBJECT_ID('MyTable') --Table Name

还有其他准确的方法可以回答这个问题吗?

1 个答案:

答案 0 :(得分:4)

如果您正在谈论谁更改了表的结构

如果它足够新,可能仍会在滚动default trace中捕获:

DECLARE @path NVARCHAR(260);

SELECT 
   @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX(CHAR(92), REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT 
  LoginName,
  HostName,
  StartTime,
  ObjectName,
  TextData
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE EventClass = 164    -- Object:Altered
AND EventSubClass = 1
ORDER BY StartTime DESC;

如果没有,那么也许是时候投资DDL triggers,源代码控制/变更管理,没有给所有同事足够的权限来更改数据库或上述所有...

如果您正在谈论谁更改了表中的数据

SQL Server不跟踪此数据。您可以查看DML触发器,SQL审计,变更跟踪,变更数据捕获,Temporal Tables的组合。您的选择将取决于您的SQL Server版本和版本,要更改的数据量以及您要跟踪的表...