【问题标题】:INSERT Trigger not firing an update?INSERT 触发器没有触发更新?
【发布时间】:2013-04-06 14:10:04
【问题描述】:

好的,所以我有一个相当基本的触发器:

换句话说,插入后,获取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]=@Country,[IPCity]=@City
            WHERE [ID] = @ROWID
        END
    ELSE
        BEGIN -- Fired correctly
            INSERT INTO [IPInfo.Missing] VALUES (@IP)
        END
END

现在的问题是,它正确添加了丢失的 IP 信息(仅在丢失时),但是,它似乎并没有更新表,我错过了什么?

我已经用我能想到的所有可能的方式对其进行了调整......(我的触发器知识相当糟糕)

【问题讨论】:

  • 我希望它在插入数据时触发,一旦插入,它应该立即更新它,这个 AFAIK 不需要更新触发器
  • 那张桌子上有什么其他触发器。如果您将更新语句替换为插入到虚拟表中,那会起作用吗?尝试几种不同的方式来看看发生了什么
  • 没有其他触发器,在虚拟桌子上它就像一个魅力
  • 很奇怪。这应该没有什么区别,但是您可以将更新更改为 - update basicdata set country=b.country,city=b.city from basicdata a , ipinfo b where a.id=(select id from inserted) 和 a。 ip=b.ip
  • 任何可能阻止此触发器的表/用户权限?你说假桌子就像一个魅力。您的帐户是否有任何权限限制?

标签: sql tsql triggers


【解决方案1】:

有几个问题:

  1. INSERTED 可以包含许多行。您的触发器只允许一个。
  2. 触发器是在插入之后,我猜这可能会排除更新。试试AFTER INSERT, UPDATE
  3. 您的 IF 语句未检查 UPDATE - 如果列被 UPDATED 为 NULL 怎么办?即使它是更新,它也不会捕捉到它。如果有东西插入了 NON NULL 数据怎么办?它会认为这是一个更新。

据我所知,识别 UPDATE 的唯一方法是在 PK 上加入 INSERTED 和 `DELETED。如果有匹配,则已更新。

也许你可以这样重写:

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)特定列不允许空值
  • 1) 我建议这不是很有防御性的编程 2) 你的意思是说你在更新后尝试过?我测试过,只放 AFTER INSERT 不会获取更新,而 AFTER INSERT,UPDATE 会。
猜你喜欢
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2016-02-16
  • 2013-03-29
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多