Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在数据库上查找DBO更改的详细信息?_Sql Server_Sql Server 2008 R2_Dbo - Fatal编程技术网

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

Sql server 如何在数据库上查找DBO更改的详细信息?,sql-server,sql-server-2008-r2,dbo,Sql Server,Sql Server 2008 R2,Dbo,我想运行一个查询,以查看特定数据库的DBO在何时以及由谁更改。我该怎么做?我在stackexchange上找到了此信息。。。试过了,成功了。唯一的问题是它只给了我上次更改DBO的用户,而不是之前的用户。我是上次更改DBO的人,因为我的应用程序无法运行。我需要知道在那之前是谁改变了DBO。有人知道我会怎么做吗?找到DBO最近几次被更改的情况,以及是谁更改的?这是让我知道上次是谁更改的代码: 这是在默认跟踪中。无论您使用sp_changedbowner还是正确的现代语法,它都将显示为后者: 将数据库

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

我在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;

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

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

当您查询
sys.traces
时,它将为SQL实例上当前运行的每个跟踪返回一条记录。如果该功能已启用,则其中一条记录应引用默认跟踪文件。defaul跟踪文件的文件格式为
log\u 000.trc
。这个数字是一个连续的数字。默认情况下,该文件存储在保存SQL ERRORLOG文件的日志目录中,无法更改

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


看起来当前跟踪文件中没有您要查找的事件,这导致它早于该文件。因此,您有两个选项,可以分别对每个文件运行
sys.fn\u trace\u gettable()
查询;或者,我会将旧文件复制到客户机或生产服务器之外的其他地方,然后在profiler中打开每个文件,具体取决于我们讨论的文件数量。如果所讨论的事件导致应用程序中断,您可以引用该时间来查找需要关注的文件。

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

下面是一篇关于跟踪的示例查询的文章:

您还可以通过
右键单击数据库->报告->架构更改历史->架构更改历史来查看SSM中的最新更改。

通过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*/ )

sys.traces只提供当前使用的默认跟踪文件。如果您浏览到该目录,它会显示您可能会找到多个带有序列号的跟踪文件。如果你想再往回看,那么在每个文件上运行第二个查询,直到找到你要查找的内容。请你再给我解释一下,好吗?非常感谢。