【问题标题】:Determine which user deleted a SQL Server database?确定哪个用户删除了 SQL Server 数据库?
【发布时间】:2009-06-25 13:34:03
【问题描述】:

我有一个已删除的 SQL Server 2005 数据库,我需要找出是谁删除了它。有没有办法获取这个用户名?

谢谢,MagicAndi。

【问题讨论】:

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


    【解决方案1】:

    如果自删除后几乎没有活动或没有活动,那么开箱即用的跟踪可能会有所帮助。尝试运行:

    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 - 谢谢,这非常有用。我刚刚运行了它,它给了我大约 2 天的备份时间。有没有办法获得更多?哪些选项负责控制这些跟踪设置?
    • @mitch:这是一个很棒的提示。不过,这是一个非常小的痕迹。有什么办法可以将其设置为更大的跟踪?
    • @Tapori:我在这里写了关于 SQL Server 内置跟踪的博客:mitch-wheat.blogspot.com/2009/01/…:可以更改黑盒跟踪的大小...
    【解决方案2】:

    我会先询问所有拥有 Sql Server 管理员权限的人是否删除了它。

    【讨论】:

    • 如果我要问三个以上的人,我也会问 DBA 为什么有这么多......
    【解决方案3】:

    检索信息的最佳方式是恢复最新的备份。

    现在讨论如何在未来避免此类问题。

    首先确保您的备份过程正确且频繁地运行。如果它是一个高度事务性的数据库,则使事务日志每 15 分钟或半小时完成一次。那么你损失最多的就是半小时的工作量。练习恢复数据库,直到您可以在压力下轻松完成为止。

    在 SQL Server 2008 中,您可以添加 DDL 触发器(不确定是否可以在 2005 年执行此操作),以便记录谁对结构进行了更改。可能值得您花时间研究一下。

    不要允许超过两个人对您的生产数据库进行管理员访问 - 一个 dba 和一个在 dba 外出时的备份人员。这些人应该加载对数据库结构和代码的所有更改,并且所有更改都应该编写脚本,首先在 QA 上对代码进行审查和测试。不应在 prod 上运行无脚本的“按你的裤子运行”的代码。

    【讨论】:

    • HLGEM - 很好的答案,可惜不是我问的问题。 -1
    • +1,这是您在当前问题之前需要问的问题的答案:“我如何防止和/或处理有人删除我的数据库”...
    • +1:一个很好的答案,因为横向思考以确定问题的根本原因。由于缺乏数据库平台审计和管理流程而失败。
    • @MagicAndi,我回答了您所问的部分问题,即如何检索信息。我添加了其他信息,因为如果您不进行备份,可能无法找回丢失的内容,至少您可以向老板提出避免重复的计划。如果您无法找到一种方法来确定谁进行了删除,这可能会挽救您的工作。有时,您会向人们提供他们需要知道或考虑的内容,而不仅仅是他们提出的问题。
    • HLGEM,我想说两点。 1.您没有回答所提出的问题,即如何识别首先删除数据库的用户?恢复上次备份将如何做到这一点? 2. 如果您想回答有关防止此问题再次发生的问题,您应该将其作为一个单独的问题提出,并在您对我的问题的回答中与此问题相关联。横向思考与否,你在回答一个不同的问题;当然,SO 的重点是为特定问题提供答案?
    【解决方案4】:

    这里是更精确的 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. 
    

    这可以用于知道或不知道数据库/对象名称的事件。结果如下所示:

    【讨论】:

      猜你喜欢
      • 2011-01-02
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 2013-09-19
      • 2011-03-10
      • 2019-05-11
      相关资源
      最近更新 更多