追踪神秘更新 SQL 的技巧?

Posted

技术标签:

【中文标题】追踪神秘更新 SQL 的技巧?【英文标题】:Tips for tracking down mystery update SQL? 【发布时间】:2010-11-13 00:11:19 【问题描述】:

我刚刚开始了一份新工作,并得到了一个需要追踪和修复的错误。基本问题是数据库记录中的一个字段被清除,没有人知道为什么。到目前为止,我已经尝试过:

检查表中的触发器, 没有。 使用 SQL 监视表 最后一对的服务器分析器 天希望错误 会再次发生,但不幸的是 它没有。 查看所有代码 插入/更新,我没有看到 任何会导致这种情况的 问题。

对于查找可以更新此记录的内容是否有任何其他建议?我不是在检查我应该做的事情吗?还有其他我应该查看的信息来源吗?

【问题讨论】:

如何审计有权访问架构/表的帐户? db_datareader 每个人 =) 【参考方案1】:

创建一个将写入历史表的触发器。包括写入日期和用户的列。

【讨论】:

【参考方案2】:

::fn_dblog() 至少会向您显示更新发生的时间(按顺序,而不是按时间)以及该事务完成了哪些其他操作。根据有关此事务执行的其他操作的信息以及当时其他事务正在执行的操作,您应该能够至少缩小发生更新的上下文,从这一点开始,代码检查是一个可行的选择继续.

读取日志需要...日志,因此您的数据库应该处于完全恢复模式。

【讨论】:

这个日志可以返回多远? 如果数据库处于完全恢复状态,那么直到最近的日志备份。在简单的恢复中直到最近的检查点(几分钟)。可以在日志备份文件本身中进一步分析,方法是使用不同的名称恢复数据库,然后一次应用一个日志,并在应用新日志之前分析日志内容。【参考方案3】:
select
schema_name = s.name,
object_name = o.name
from sys.sql_modules m join sys.objects o on m.object_id = o.object_id
    join sys.schemas s on o.schema_id = s.schema_id
where definition like '%FieldName%'

此查询查看数据库中的所有对象(存储过程、函数、视图)并查找引用“FieldName”的任何位置。我将检查此查询返回的所有对象,以查看该字段是否有任何异常。这可能会非常乏味,因为它可能会返回比您关心的更多的结果,但它是捕获对该字段的所有引用的可靠方法

【讨论】:

【参考方案4】:

如果您使用的是 SQL Server 2008,则可以使用扩展事件来获取违规语句的完整堆栈跟踪。示例代码在这里Create Trigger to log SQL that affected table?

【讨论】:

以上是关于追踪神秘更新 SQL 的技巧?的主要内容,如果未能解决你的问题,请参考以下文章

追踪内核中神秘的高优先级线程挂起

sql 带有更新追踪程序的SQL CTE公用表表达式示例。

unity_实用小技巧(敌人追踪主角)

SQL 追踪

SQL追踪

当我们追踪源码时,要追踪到什么程度?