如何弄清楚为啥行从我的 SQL 服务器中消失了?
Posted
技术标签:
【中文标题】如何弄清楚为啥行从我的 SQL 服务器中消失了?【英文标题】:How to figure out why rows are disappearing from my SQL server?如何弄清楚为什么行从我的 SQL 服务器中消失了? 【发布时间】:2012-10-05 19:15:20 【问题描述】:我正在使用由另一个程序员团队维护多年的 SQL Server 2008 安装。
我遇到了一个问题,数据行似乎从我服务器的特定表中神秘地消失了。
我希望能够设置某种监控系统,当表格被修改时会告诉我,以及修改的摘要。
我认为“触发器”可能是我正在寻找的东西,但我以前从未使用过它们。触发器是我想要使用的吗?如果是,那么学习使用它们的好资源是什么?有没有更好的解决方案?
我认为我应该提一下,我所指的表并不经常更新,所以我不认为增加一点开销应该是什么大不了的,但我更喜欢我自己的解决方案问题解决后可以刷掉。
【问题讨论】:
你不能检查与数据库交互的代码吗? 我已经彻底检查了代码,找不到任何东西。 可以选择 sql profiler 吗? 你怎么知道缺少行? 【参考方案1】:FOR DELETE 触发器可以帮助您捕获正在删除的行。您可以创建一个审计表(您要监控的表的副本),然后将此代码添加到您的触发器中:
INSERT INTO [Your Audit Table]
SELECT * FROM deleted
我还看到了一些涉及 FOR XML 的“更高级”的场景。
我不知道触发器会帮助确定谁在删除记录,但您可能能够证明记录正在被删除,也许是什么时间等。这可以帮助您进一步排除故障。
【讨论】:
【参考方案2】:以下示例应该是您正在寻找的基本概念。
CREATE TABLE MyTestTable(col1 int, col2 varchar(10));
GO
CREATE TABLE MyLogTable(col1 int, col2 varchar(10), ModDate datetime, ModBy varchar(50));
GO
CREATE TRIGGER tr_MyTestTable_IO_UD ON MyTestTable AFTER UPDATE, DELETE
AS
INSERT MyLogTable
SELECT col1, col2, GETDATE(), SUSER_SNAME()
FROM deleted;
GO
Insert MyTestTable Values (1, 'aaaaa');
Insert MyTestTable Values (2, 'bbbbb');
UPDATE MyTestTable Set col2 = 'bbbcc' WHERE col1 = 2;
DELETE MyTestTable;
GO
SELECT * FROM MyLogTable;
GO
但是,请记住,仍有一些方法可以删除触发器无法捕获的记录。 (TRUNCATE TABLE 和各种批量更新命令。)
【讨论】:
【参考方案3】:另一种解决方案是将Sql Profiler 附加到具有特定条件的数据库中。这将记录每个查询运行以供您检查。
我喜欢远离触发器,但它们可以帮助解决您的问题,就像 Draghon 所说的那样
【讨论】:
【参考方案4】:我想你已经明白了。触发器可能是您最好的选择,因为它尽可能接近数据。检查代码(编程甚至存储过程)不会像触发器那样为您提供保证;在这种情况下为 Delete 触发器。
查看这篇文章:http://www.go4expert.com/forums/showthread.php?t=15510
【讨论】:
触发器可以给我有关触发它的 SQL 语句的信息吗? 不是单独的;触发器实际上是用于在 DML 语句中间注入代码。我发现了一个类似的问题here。该解决方案要求使用系统模式的 dm_exec_query_stats 和 dm_exec_sql_text 函数。一个小查询可能会显示执行删除操作的最后语句,您可以在不使用触发器的情况下使用它。触发器仍然会派上用场,因为只存储了一定数量的查询(天)。 在您引用的文章中,它解释了触发器可以利用inserted
和deleted
临时表让我看到正在插入或删除哪些数据。这正是我所需要的。以上是关于如何弄清楚为啥行从我的 SQL 服务器中消失了?的主要内容,如果未能解决你的问题,请参考以下文章