昨天发生了不好的事情。
前一段时间创建的视图被某人修改,最终破坏了报告。很遗憾。有人(有意或无意)在 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)
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密码的人都可以登录。
不,除非您通过 DDL 触发器或类似方式记录它
您想查看谁作为该数据库中的 ALTER 权限,或 sysadmin/db_owner/ddl_admin 角色的成员身份。作为一般评论而不是猎巫,这会更好。可能还有其他人有权进行未经批准和未经授权的更改