2013-04-06 211 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