确定哪个用户删除了SQL Server数据库?

时间:2009-06-25 13:34:03

标签: sql-server database sql-server-2005

我有一个已被删除的SQL Server 2005数据库,我需要发现谁删除了它。有没有办法获得这个用户名?

谢谢,MagicAndi。

4 个答案:

答案 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. 

这可以在知道或不知道数据库/对象名称的两个事件中使用。结果如下:

enter image description here