实际上,其中一项关键作业在执行时失败了。
在错误信息中发现失败是因为缺少一个存储过程。
现在我如何找出存储过程何时受到用户的影响。我如何找出哪个用户执行了该操作以及他何时执行了该操作?
答案1
您将获得管理跟踪:
select * from fn_trace_getinfo(NULL)
where property=2
and traceid = 1
您查看第 47 类事件的管理跟踪对象:已删除事件类关于对象类型8727 存储过程:
select * from fn_trace_gettable('....trc', -1)
where EventClass = 47
and ObjectType=8727
管理跟踪会定期回收,并且会保留大约 4-5 个跟踪,您应该使用仍然存在的最旧的 trc 文件的名称。
如果该过程至关重要,那么 DBA 应该确保只有授权人员才能修改或删除它。并且应该对架构更改进行审计。这不是删除该过程的人的错,而是 DBA 的错。
答案2
默认情况下,没有办法找出此信息,因为 SQL Server 不支持此功能。如果您的数据库处于完全恢复模式,您可以尝试读取事务日志并查看何时执行了 DROP PROCEDURE 语句。不幸的是,没有简单的方法可以做到这一点。
您可以尝试使用一些第三方工具,例如ApexSQL 日志或者探索蟾蜍但即使有了这些工具,我也不确定你是否能够找出执行此操作的用户名。
您可以尝试的另一个选项是检查 fn_dblog 函数,看看是否可以使用它。问题是这个函数没有很好的文档记录。
答案3
我认为你在这里问错了问题。
为什么你不信任的人在你的数据库中拥有足够的权限来删除该存储过程?那是你需要问的问题。
这就像您把钥匙留在门廊上后试图找出是谁抢劫了您的房子。
答案4
您应该能够回顾事务日志,至少能够找出该过程从数据库中删除的时间。至于用户是谁,您可能能够看到当时谁登录了系统,并能够缩小范围。
希望这对一些人有帮助。