我正在使用由另一个程序员团队维护多年的SQL Server 2008安装。
我遇到的问题是,数据行似乎神秘地从我服务器中的特定表中消失。
我希望能够建立某种监控系统,告诉我何时修改表格,以及修改的摘要。
我认为“触发器”可能是我正在寻找的东西,但我以前从未使用它们。触发器是我想要使用的,如果是,那么学习使用它们的好资源是什么?有更好的解决方案吗?
我认为我应该提到我所指的表并不经常更新,所以我不认为增加一点开销应该是一个大问题,但我更喜欢我的解决方案一旦问题得到解决,它就会消失。
答案 0 :(得分:2)
FOR DELETE触发器可以帮助您捕获正在删除的行。您可以创建一个审计表(您要监视的表的副本),然后将此代码添加到您的触发器中:
INSERT INTO [Your Audit Table]
SELECT * FROM deleted
我还看到了一些涉及FOR XML的“更高级”场景。
我不知道触发器有助于确定谁正在删除记录,但您可能能够证明记录被删除,也许是时间等等。这可以帮助您进一步排除故障。
答案 1 :(得分: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和各种批量更新命令。)
答案 2 :(得分:1)
另一种解决方案是将Sql Profiler附加到具有特定条件的数据库。这将记录每次查询运行以供检查。
我喜欢远离触发器,但他们可以为你的问题提供帮助,比如Draghon说
答案 3 :(得分:0)
我想你已经明白了。触发器可能是您最好的选择,因为它尽可能接近数据。检查代码(编程甚至是存储过程)不会像触发器那样给你一个保证;在这种情况下删除触发器。
查看此文章:http://www.go4expert.com/forums/showthread.php?t=15510