5

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

4

3 回答 3

0

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

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

将 database::[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;

现在,该事件可能发生在很久以前,因此它不一定仍在跟踪中。

于 2012-09-19T18:49:28.920 回答
0

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

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

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

看起来当前跟踪文件中没有您要查找的事件,这导致它在该文件之前。因此,您有两种选择,即 sys.fn_trace_gettable()分别对每个文件运行查询;或者我会将旧文件复制到客户端计算机或生产服务器之外的其他地方,然后在分析器中打开每个文件,具体取决于我们正在谈论的数量。如果有问题的事件导致您的应用程序中断,您可以明显地参考那个时间来查找您需要关注的文件。

于 2012-09-19T21:14:36.537 回答
0

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

这是一篇包含跟踪示例查询的文章: 默认跟踪

您还可以通过以下方式查看 SSMS 中的最新更改right-clicking on the database -> Reports -> Schema Changes History -> Schema Changes History.

通过 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*/ )
于 2018-07-31T23:28:16.073 回答