【发布时间】:2014-02-06 09:25:50
【问题描述】:
我在一个表上有一个 SQL 触发器,它将在插入、更新和删除之后触发。
我将所有受影响的记录插入到一个单独的物理表中,其中包含定义更新状态的代码。下面的代码 sn -p 是定义的触发器。
CREATE TRIGGER [dbo].[DATA_CACHE]
ON [dbo].[DATA_USAGE]
for Insert,Update,Delete
AS
BEGIN
if(select COUNT(*) from inserted)>0
begin
if (select COUNT(*) from deleted)>0
BEGIN
--update
INSERT INTO CACHE_UPDATE_TABLE (CODE, ID, DATE, COUNT)
SELECT 2, ins.ID, ins.DATE, ins.COUNT
from inserted ins
END
else
begin
-- insert
INSERT INTO CACHE_UPDATE_TABLE (CODE, ID, DATE, COUNT)
SELECT 1, ins.ID, ins.DATE, ins.COUNT
from inserted ins
end
END
else
BEGIN
-- delete
INSERT INTO CACHE_UPDATE_TABLE (CODE, ID, DATE, COUNT)
SELECT 3, del.ID, del.DATE, del.COUNT
from deleted del
end
END
SELECT * FROM CACHE_UPDATE_TABLE
正如您在上面的触发器中看到的,我在 MISTAKE 触发器之后添加了一条附加语句,从目标表中选择所有值。该语句在定义的触发器之后,但是当我尝试更改触发器时,通过右键单击触发器并选择修改,它还向我显示了触发器结束块之后的 select 语句。
这是否意味着每次触发触发器时都会执行此选择语句?这是我的第一个问题(问题 A)- 可能是一个愚蠢的问题,但我对此有点困惑。
我的第二个问题是(问题 B)我在 CACHE_UPDATE_TABLE 上遇到锁定问题,这可能是锁定的原因吗?还有一个 SQL 作业每隔一分钟运行一次以检查 CACHE_UPDATE_TABLE 表,然后我执行一些操作(与链接服务器相关)并在完成后从 CACHE_UPDATE_TABLE 中删除这些记录。锁定问题可能是因为这个?如果是这样,我该如何应对?
我的第三个问题是(问题 C)这是使用触发器执行此操作的最佳方式还是我可以通过其他方式执行此操作吗?触发器定义是否正确?
-任何帮助将不胜感激...谢谢。
【问题讨论】:
-
你有很多问题,这就是为什么你没有收到任何答案。例如,我可以部分回答 A,完全回答 C,但不能回答 B。
标签: sql-server tsql triggers