2013-04-06 255 views
-1

行,所以我有一个非常基本的触发器: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正确的信息(只有当失踪),但是,它似乎并没有更新表时,它是什么,我错过了什么?

伊夫调整了它在一切可能的方式我能想到的......(我的触发知识是相当糟糕的)

+0

我想一旦被插入插入数据时,它开火,就应立即更新,不需要更新触发此AFAIK – 2013-04-06 14:15:15

+0

什么其他的触发器,如果​​你有任何在该表上。如果你用一个插入替换你的更新语句到一个虚拟表,这是否工作?尝试几种不同的方法来看看有什么不对的 – Brian 2013-04-06 14:31:21

+0

没有其他的触发器,并且在一个虚拟桌子上,它像一个魅力 – 2013-04-06 14:36:40

回答

0

有几个问题:

  1. 插入,可容纳多行。你的触发器只允许一个。
  2. 触发器是AFTER INSERT,我想这可能会排除UPDATE。尝试AFTER INSERT, UPDATE
  3. 您的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 
+0

1)该表只能一次插入一行。 2)我插入后尝试过,没有运气。 3)具体的列不允许为空 – 2013-04-07 09:08:16

+0

1)我建议不是很防守编程2)你的意思是说你尝试过后更新?我测试过,只有放入AFTER INSERT不会选择更新,而AFTER INSERT,UPDATE则会。 – 2013-04-07 12:05:48