确定架构更改是如何发生的?


21

昨天发生了一些坏事。

某人之前修改过的某个视图后来被某人修改,最终破坏了报告。不幸。某人(在不知不觉中)在PRODUCTION数据库中进行了此修改。

我的问题:有没有一种方法(脚本/软件/免费软件等),我们可以借此了解谁(用户名)进行了此修改,因此我可以撤消该用户对生产数据库的访问。

如果我的问题不清楚,请发表评论。

Answers:


36

这将记录到默认跟踪中,因此,只要启用它并且在此期间没有翻转,它就应该出现在“ Schema Changes History”报告中。

要在Management Studio中访问它,请右键单击数据库,然后从上下文菜单中选择 Reports -> Standard Reports -> 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*/ )

谢谢马丁,我通过用我的视图替换'FOO'来执行查询,但是没有返回任何内容。知道为什么会这样吗?我没有在服务器上执行
xorpower

1
@Xorpower-我编辑了它以处理Object:Created事件,以防万一视图被删除和创建而不是更改。不知道不在服务器上执行意味着什么?当然,您需要连接到正确的实例,但是只要您具有权限,连接的来源就无关紧要。
马丁·史密斯

感谢马丁,但结果仍然保持不变
xorpower 2012年


3
@Xorpower-看起来跟踪已经结束,并且您丢失了任何超过11小时左右的内容的细节。默认跟踪仅保留5个文件,然后删除较旧的文件。您可能要检查服务器上文件系统上的文件夹,只是为了检查是否确实如此。您可以从SELECT path FROM sys.traces where is_default=1
Martin Smith

19

马丁已经指出了最佳途径,通常是行政审计跟踪(除非已被明确禁用)。 如果您无法在管理跟踪中找到该信息(已禁用或已回收),则可以从日志备份中检索该信息。由于是生产数据库,因此我假设您有一个定期的备份周期,其中包含定期的完整备份和日志备份。您将需要在另一台服务器上将数据库还原到事件发生前后,以便DDL位于当前还原的日志中。这是使用fn_dblog()和检查日志的简单问题。

一种方法是按事务开始操作:

select [Begin Time], [Transaction Name], [Transaction SID], * 
from fn_dblog(null, null)
where Operation = 'LOP_BEGIN_XACT';

如果ALTER VIEW是在独立交易中发行的(即未被BEGIN TRANSACTION /COMMIT),它将开始一个名为的交易CreatProc transaction。查找它,这[Transaction SID]是您想要的登录SID。

另一种可能性是在所需的视图上查找获得SCH_M的事务:

select [Lock Information], * 
from fn_dblog(null, null)
where [Lock Information] like '%' + cast(object_id('...') as varchar(10))+'%'
and [Lock Information] like '%LOCK_SCH_M%'
go

请注意,如果先后通过DROP更改视图,然后再创建CREATE,则对象ID可能已更改,但是至少您会获得最后一次执行CREATE的事务(已还原数据库中视图的当前对象ID)。使用交易ID,您可以返回并获取开始交易信息:

select [Begin Time], [Transaction Name], [Transaction SID], *
from fn_dblog(null, null)
where [Transaction ID] = '...'
and Operation = 'LOP_BEGIN_XACT';

[交易SID]还是您的同伴。用于SUSER_SNAME从登录SID检索登录名。如果SID为0x01,则表示登录为sa,这意味着任何知道sa密码的个人都可以这样做。


2
关于阅读日志文件的不错提示。如果有人禁用了默认跟踪,这将派上用场。
StanleyJohns,2012年

如果交易SID为空怎么办?
evictednoise

@evictednoise,请发布相关的日志记录(在另一个问题中)。原因可能不止一个,日志记录将有助于确定实际原因。
Remus Rusanu

6

否,除非您通过DDL触发器或类似工具记录了它

您想查看谁是该数据库中的ALTER权限,或者是sysadmin / db_owner / ddl_admin角色的成员身份。从总体上看,这比打猎更好。可能还有其他人也有权进行未经批准和未经授权的更改


0

如果还没有,您可能想查看SQL Server Management Studio中提供的“ 架构更改历史记录”报告。看起来默认情况下SQL Server日志更改(默认跟踪),您应该能够通过此报告查看该数据。唯一不幸的是,这些跟踪文件会随着时间的流逝而自动删除/翻转,因此数据可能已经消失了。祝好运!


哎呀,没关系。我看到马丁·史密斯(Martin Smith)在回答中已经引用了此报告。我会把它留在这里,以防万一任何链接都有用。
Mark Madej
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.