0

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

我只想更新已经/已经更新的行。我下面的触发器会更新整个表格。下面的触发器只测试两列的变化。

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

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。

4

2 回答 2

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
于 2013-07-16T18:37:26.870 回答
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
于 2013-07-16T22:37:17.057 回答