如何在数据库中查找DBO更改的详细信息?

时间:2012-09-19 15:29:37

标签: sql-server sql-server-2008-r2 dbo

我想运行一个查询来查看特定数据库的DBO何时以及由谁更改。我该怎么做?

3 个答案:

答案 0 :(得分:0)

我在stackexchange上找到了这个信息......并尝试了它并且它有效。唯一的问题是它只给了我最后一次更改DBO的用户,而不是之前的时间。我是最后一次更改DBO的人,因为我的应用程序无法运行。我需要知道谁在那之前更改了DBO。有谁知道我会怎么做 - 找到DBO被改变的最后几次以及由谁改变?这是让我知道最后一次改变它的代码:

这是默认跟踪。无论您使用sp_changedbowner还是正确的现代语法,它都将显示为后者:

将数据库:: [foo]上的授权更改为[bar] 您可以通过以下方式检索信息:

DECLARE @path NVARCHAR(260);

SELECT 
   @path = REVERSE(SUBSTRING(REVERSE([path]), 
   CHARINDEX('\', REVERSE([path])), 260)) + N'log.trc'
FROM    sys.traces
WHERE   is_default = 1;

SELECT * -- whittle down to the meaningful trace columns
FROM sys.fn_trace_gettable(@path, DEFAULT)
WHERE EventClass = 152
ORDER BY StartTime DESC;

现在,事件可能已经发生很久了,所以它不一定会在追踪中。

答案 1 :(得分:0)

参考您关于解释有关默认跟踪文件的更多信息的评论......

当您查询sys.traces时,它将返回当前在SQL实例上运行的每个跟踪的记录。如果启用该功能,其中一条记录应引用默认跟踪文件。默认跟踪文件的文件格式为log_000.trc。该数字是一个序号。默认情况下,该文件存储在保存SQL ERRORLOG文件的LOG目录中,并且无法更改。

如果您转到该目录,您可能会找到默认跟踪的多个跟踪文件。一旦文件达到20MB,默认跟踪将创建一个新文件我相信。由于默认跟踪不会捕获大量信息,因此通常不会创建大量文件。虽然我会注意到它应该被监控,但是长时间不受影响的系统可能会堆积这些小文件并导致存储空间填满。

当前跟踪文件看起来没有您要查找的事件,这导致它在该文件之前。因此,您可以选择在每个文件上单独运行sys.fn_trace_gettable()查询;或者我会把旧文件复制到客户端计算机或者我的生产服务器之外的东西,然后根据我们谈论的数量在分析器中打开每个文件。如果相关事件导致您的应用程序中断,您可以通过参考时间来查找需要关注的文件。

答案 2 :(得分:0)

您可以从默认跟踪中获取该信息。

这是一篇有关跟踪示例查询的文章:Default Trace

您还可以通过right-clicking on the database -> Reports -> Schema Changes History -> Schema Changes History.

查看SSMS中的最新更改。

通过TSQL,您可以使用:

SELECT StartTime
       ,LoginName
       ,f.*
FROM   sys.traces t
       CROSS APPLY fn_trace_gettable(REVERSE(SUBSTRING(REVERSE(t.path),
                                                       CHARINDEX('\', REVERSE(t.path)), 
                                                       260)
                                             ) + N'log.trc', DEFAULT) f
WHERE  t.is_default = 1
       AND ObjectName = 'FOO'
       AND EventClass IN (46, /*Object:Created*/
                          47, /*Object:Dropped*/
                          164 /*Object:Altered*/ )