0

我正在使用由另一个程序员团队维护多年的 SQL Server 2008 安装。

我有一个问题,数据行似乎神秘地从我的服务器中的特定表中消失了。

我希望能够建立某种监控系统,当表格被修改时会告诉我,以及修改的摘要。

我认为“触发器”可能是我正在寻找的东西,但我以前从未使用过它们。触发器是我想要使用的吗?如果是,那么学习使用它们的好资源是什么?有更好的解决方案吗?

我想我应该提一下,我所指的表不是那么频繁更新,所以我认为增加一点开销应该没什么大不了的,但我更喜欢我可以刷掉的解决方案一旦问题得到解决。

4

4 回答 4

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 和各种批量更新命令。)

于 2012-10-05T19:33:01.063 回答
2

FOR DELETE 触发器可以帮助您捕获正在被删除的行。您可以创建一个审计表(您要监控的表的副本),然后将此代码添加到您的触发器中:

INSERT INTO [Your Audit Table]
SELECT * FROM deleted

我还看到了一些涉及 FOR XML 的“更高级”的场景。

我不知道触发器将有助于确定谁在删除记录,但您可能能够证明记录正在被删除,也许是什么时间等。这可以帮助您进一步排除故障。

于 2012-10-05T19:25:55.490 回答
1

另一种解决方案是将Sql Profiler附加到具有特定条件的数据库。这将记录每个查询运行以供您检查。

我喜欢远离触发器,但它们可以帮助解决你的问题,就像 Draghon 说的那样

于 2012-10-05T19:22:38.247 回答
0

我想你已经想通了。触发器可能是您最好的选择,因为它尽可能接近数据。检查代码(编程甚至存储过程)不会像触发器那样为您提供足够的保证;在这种情况下,删除触发器。

查看这篇文章:http ://www.go4expert.com/forums/showthread.php?t=15510

于 2012-10-05T19:19:46.630 回答