我真的很难回答我的同事这个问题,有时我们在表上进行了更改,我们不知道更改了谁或何时更改,我有此查询,但有时并不太准确。
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
还有其他准确的方法可以回答这个问题吗?
答案 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版本和版本,要更改的数据量以及您要跟踪的表...