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

xor*_*wer 21 sql-server view

昨天发生了不好的事情。

前一段时间创建的视图被某人修改,最终破坏了报告。很遗憾。有人(有意或无意)在 PRODUCTION 数据库中进行了此修改。

我的问题:有没有办法(脚本/软件/免费软件等)让我们知道谁(用户名)做了这个修改,这样我就可以撤销该用户对生产数据库的访问权限。

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

Mar*_*ith 36

这会记录到默认跟踪中,因此,只要它处于启用状态并且在此期间没有翻转,它就应该出现在“架构更改历史记录”报告中。

要在 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*/ )
Run Code Online (Sandbox Code Playgroud)

  • @Xorpower - 那么看起来跟踪已经结束了,你已经丢失了大约 11 小时之前的任何细节。默认跟踪只保留 5 个文件,然后删除旧文件。您可能想检查服务器上的文件系统文件夹只是为了检查这绝对是这种情况。您可以从`SELECT path FROM sys.traces where is_default=1`获取文件夹路径 (3认同)

Rem*_*anu 19

Martin 已经指出了最佳途径,即通常启用的管理审计跟踪(除非已明确禁用)。如果您在管理跟踪中找不到信息(被禁用或已回收),您可以从日志备份中检索信息。由于是生产数据库,我假设您有定期备份周期,定期进行完整备份和日志备份。您需要在单独的服务器上将数据库恢复到事件发生的前后,以便 DDL 位于当前恢复的日志中。然后是使用fn_dblog()和检查日志的简单问题。

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

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

如果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
Run Code Online (Sandbox Code Playgroud)

请注意,如果视图由 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';
Run Code Online (Sandbox Code Playgroud)

[Transaction SID] 又是你的人。用于SUSER_SNAME从登录 SID 中检索登录名。如果 SID 是 0x01,则表示登录名是sa,这意味着任何知道sa密码的人都可以登录。

  • 阅读日志文件的好技巧。如果有人禁用了默认跟踪,这会派上用场。 (2认同)

gbn*_*gbn 6

不,除非您通过 DDL 触发器或类似方式记录它

您想查看谁作为该数据库中的 ALTER 权限,或 sysadmin/db_owner/ddl_admin 角色的成员身份。作为一般评论而不是猎巫,这会更好。可能还有其他人有权进行未经批准和未经授权的更改