【发布时间】:2014-03-07 13:07:36
【问题描述】:
我最近创建了一个 SQL 触发器来替换我曾经运行的非常昂贵的查询,以减少我的数据库每天执行的更新量。
在执行更新之前,我会检查当天已经发生了多少更新,这曾经通过查询来完成:
SELECT COUNT(*) FROM Movies WHERE DateAdded = Date.Now
我的数据库有超过 100 万条记录,这个查询每分钟运行大约 1-2k,所以你可以明白我为什么要为此采取新方法。
所以我创建了一个审计表并设置了一个 SQL 触发器,以在 Movie 表上发生任何 INSERT 或 UPDATE 时更新此表。但是我注意到审计表每天有几百个不同步(审计表计数高于电影表中的实际更新)。由于这不会造成大问题,我只是好奇是什么原因造成的,或者如何调试它?
SQL 触发器:
ALTER TRIGGER [dbo].[trg_Audit]
ON [dbo].[Movies]
AFTER UPDATE, INSERT
AS
BEGIN
UPDATE Audit SET [count] = [count] + 1 WHERE [date] = CONVERT (date, GETDATE())
IF @@ROWCOUNT=0
INSERT INTO audit ([date], [count]) VALUES (GETDATE(), 1)
END
上述触发器仅在 Movie 表上的 UPDATE 或 INSERT 之后发生,并尝试更新 Audit 表中的 count + 1,如果它不存在 (IF @@ROWCOUNT=0),则创建它。任何帮助将非常感激!谢谢。
【问题讨论】:
-
您是否意识到,如果您一次更新 10 条记录,此触发器只会将计数增加 1?
-
@OGHaza 很好,因为我一次从不更新或插入多个记录,而且审计表计数(同步问题)高于我查询电影表时返回的值与 WHERE DateAdded = Date.Now... 这就是我想要弄清楚的
-
这意味着我的触发器被触发的次数超过了数据库的实际更新/插入量。我还进行了测试,以确保当我创建和 #tempTables 时它没有触发,也不是那样。
-
那么在这种情况下,您的电影表必须有一些额外的更新......
-
当使用 AFTER UPDATE, INSERT 是否意味着它只会在成功更新/插入正确后触发?
标签: sql-server tsql triggers counter audit-logging