INSERT触发器没有触发更新?
行,所以我有一个非常基本的触发器:INSERT触发器没有触发更新?
在口头上,插入后,获取IP信息,并与新的数据
CREATE TRIGGER [BasicData.IPInfo.Gather]
ON [BasicData]
AFTER INSERT
AS
BEGIN
DECLARE @City VARCHAR(1000),
@Country VARCHAR(1000),
@IP VARCHAR(1000),
@ROWID UNIQUEIDENTIFIER
SELECT @IP=[IP],@ROWID=[ID] FROM [inserted]
SELECT @Country = [Country], @City= [City]
FROM [IPInfo] WHERE [IP] = @IP
IF (@City IS NOT NULL) AND (@Country IS NOT NULL)
BEGIN -- Never seems to fire
UPDATE [BasicData]
SET [IPCountry][email protected],[IPCity][email protected]
WHERE [ID] = @ROWID
END
ELSE
BEGIN -- Fired correctly
INSERT INTO [IPInfo.Missing] VALUES (@IP)
END
END
现在的问题是更新插入的行,它增加了丢失的IP正确的信息(只有当失踪),但是,它似乎并没有更新表时,它是什么,我错过了什么?
伊夫调整了它在一切可能的方式我能想到的......(我的触发知识是相当糟糕的)
有几个问题:
- 插入,可容纳多行。你的触发器只允许一个。
- 触发器是AFTER INSERT,我想这可能会排除UPDATE。尝试
AFTER INSERT, UPDATE
- 您的IF语句不检查UPDATE - 如果列UPDATE为NULL会怎样?即使它是一个更新,它也不会捕获它。如果有东西插入非空数据会怎么样?它会认为这是一个更新。
据我所知,唯一识别UPDATE的方法是加入INSERTED
和`DELETED on the PK。如果有匹配,它就会被更新。
也许你可以把它改写这样的:
CREATE TRIGGER [BasicData.IPInfo.Gather]
ON [BasicData]
AFTER INSERT, UPDATE
AS
BEGIN
-- Save UPDATES to BasicData
UPDATE [BasicData]
SET [IPCountry]=I.Country,[IPCity]=I.City
FROM [BasicData] UT
INNER JOIN
[inserted] I
ON I.ID = UT.ID
INNER JOIN
Deleted D
ON D.ID = I.ID
INNER JOIN
[IPInfo] IP
ON I.ID = IP.ID
-- Save inserts to Missing
INSERT INTO [IPInfo.Missing] (IP)
SELECT IP FROM
INSERTED I
WHERE NOT EXISTS (SELECT 1 FROM DELETED D WHERE D.ID = I.ID)
END
1)该表只能一次插入一行。 2)我插入后尝试过,没有运气。 3)具体的列不允许为空 – 2013-04-07 09:08:16
1)我建议不是很防守编程2)你的意思是说你尝试过后更新?我测试过,只有放入AFTER INSERT不会选择更新,而AFTER INSERT,UPDATE则会。 – 2013-04-07 12:05:48
我想一旦被插入插入数据时,它开火,就应立即更新,不需要更新触发此AFAIK – 2013-04-06 14:15:15
什么其他的触发器,如果你有任何在该表上。如果你用一个插入替换你的更新语句到一个虚拟表,这是否工作?尝试几种不同的方法来看看有什么不对的 – Brian 2013-04-06 14:31:21
没有其他的触发器,并且在一个虚拟桌子上,它像一个魅力 – 2013-04-06 14:36:40