【发布时间】:2009-06-25 13:34:03
【问题描述】:
我有一个已删除的 SQL Server 2005 数据库,我需要找出是谁删除了它。有没有办法获取这个用户名?
谢谢,MagicAndi。
【问题讨论】:
标签: sql-server database sql-server-2005
我有一个已删除的 SQL Server 2005 数据库,我需要找出是谁删除了它。有没有办法获取这个用户名?
谢谢,MagicAndi。
【问题讨论】:
标签: sql-server database sql-server-2005
如果自删除后几乎没有活动或没有活动,那么开箱即用的跟踪可能会有所帮助。尝试运行:
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 的帖子向您展示了如何配置它。]
【讨论】:
我会先询问所有拥有 Sql Server 管理员权限的人是否删除了它。
【讨论】:
检索信息的最佳方式是恢复最新的备份。
现在讨论如何在未来避免此类问题。
首先确保您的备份过程正确且频繁地运行。如果它是一个高度事务性的数据库,则使事务日志每 15 分钟或半小时完成一次。那么你损失最多的就是半小时的工作量。练习恢复数据库,直到您可以在压力下轻松完成为止。
在 SQL Server 2008 中,您可以添加 DDL 触发器(不确定是否可以在 2005 年执行此操作),以便记录谁对结构进行了更改。可能值得您花时间研究一下。
不要允许超过两个人对您的生产数据库进行管理员访问 - 一个 dba 和一个在 dba 外出时的备份人员。这些人应该加载对数据库结构和代码的所有更改,并且所有更改都应该编写脚本,首先在 QA 上对代码进行审查和测试。不应在 prod 上运行无脚本的“按你的裤子运行”的代码。
【讨论】:
这里是更精确的 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.
这可以用于知道或不知道数据库/对象名称的事件。结果如下所示:
【讨论】: