简单更新触发器+简单行插入

时间:2013-07-16 18:11:54

标签: sql-server-2008 sql-server-2008-r2

触发器的新手...所有的文档都不会打扰初学者。

我只想更新已更新的行。我的触发器在下面更新整个表格。下面的触发器只测试两列进行更改。

如何将此更新触发器限制为仅更新更新的行而不是整个表?

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(Latitude) OR UPDATE(Longitude))
BEGIN
    UPDATE Site
    SET geog = geography::Point([Latitude], [Longitude], 4326)
    WHERE Latitude is not null and Longitude is not null
END

我可以使用FOR UPDATE,INSERT对插入的行使用相同的触发器吗?可能不会因为IF检查列上的UPDATE(),除非INSERT暗示UPDATE。

2 个答案:

答案 0 :(得分:1)

首先,在任何情况下,您都不会设计触发器来仅更新SQL Server中的一行。您将其设计为更新插入,删除或更新的行。触发器在批处理中运行,您不能假设您永远不会在命中数据库的代码中更改多个记录。

您可以通过加入两个仅在触发器中插入或删除的伪节点之一来实现。 Inserted包含新记录或更新后的值,delted包含已删除记录的值或更新前的值。

您可以尝试以下方式:

ALTER TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON


UPDATE S
    SET geog = geography::Point(i.[Latitude], i.[Longitude], 4326)
    FROM Site s 
    JOIN Inserted I on s.id = i.id
    WHERE Latitude is not null and Longitude is not null

答案 1 :(得分:0)

这是最终的UPDATE触发器。我做了一个几乎相同的INSERT触发器。

CREATE TRIGGER [dbo].[geog_update] ON [dbo].[Site]
FOR UPDATE
AS
SET NOCOUNT ON
IF (UPDATE(Latitude) OR UPDATE(Longitude))
BEGIN   
    UPDATE t1
    SET t1.geog = geography::Point(t1.Latitude, t1.Longitude, 4326)
    FROM  Site AS t1 INNER JOIN Inserted AS t2 ON t1.Site_ID = t2.Site_ID
    WHERE (t1.Latitude IS NOT NULL) 
    AND (t1.Longitude IS NOT NULL) 
    AND (t1.Record_Archive_Date IS NULL)
END