我有一个已被删除的SQL Server 2005数据库,我需要发现谁删除了它。有没有办法获得这个用户名?
谢谢,MagicAndi。
答案 0 :(得分:10)
如果删除后很少或没有活动,那么开箱即用的跟踪可能会有所帮助。尝试运行:
DECLARE @path varchar(256)
SELECT @path = path
FROM sys.traces
where id = 1
SELECT *
FROM fn_trace_gettable(@path, 1)
[除了开箱即用的跟踪之外,还有一个鲜为人知的“黑匣子”跟踪,这对于诊断间歇性服务器崩溃非常有用。这篇文章SQL Server’s Built-in Traces向您展示了如何配置它。]
答案 1 :(得分:4)
如果他们删除了Sql Server,我首先会问每个拥有管理员访问权限的人。
答案 2 :(得分:3)
检索信息的最佳方法是恢复最新的备份。
现在讨论如何在将来避免此类问题。
首先确保您的备份过程正常且经常运行。如果事务日志是高度事务性的数据库,则使事务日志显示为15分钟或半小时。那么你失去的最多就是半个小时的工作。练习恢复数据库,直到你可以在压力下轻松完成。
在SQL Server 2008中,您可以添加DDL触发器(不确定您是否可以在2005年执行此操作),这样可以记录对结构进行更改的人员。你可能值得花时间研究这个问题。
不允许两个以上的人管理员访问您的生产数据库 - dba和dba外出时的备份人员。这些人应该加载对数据库结构和代码的所有更改,并且所有更改都应该编写脚本,代码审查并首先在QA上进行测试。没有没有脚本,“你的裤子座位”代码应该在prod上运行。
答案 3 :(得分:3)
这里有更精确的TSQL
SELECT DatabaseID,NTUserName,HostName,LoginName,StartTime
FROM
sys.fn_trace_gettable(CONVERT(VARCHAR(150),
( SELECT TOP 1
f.[value]
FROM sys.fn_trace_getinfo(NULL) f
WHERE f.property = 2
)), DEFAULT) T
JOIN sys.trace_events TE ON T.EventClass = TE.trace_event_id
WHERE TE.trace_event_id =47 AND T.DatabaseName = 'delete'
-- 47 Represents event for deleting objects.
这可以在知道或不知道数据库/对象名称的两个事件中使用。结果如下: