触发器的新手...所有的文档都不会打扰初学者。
我只想更新已更新的行。我的触发器在下面更新整个表格。下面的触发器只测试两列进行更改。
如何将此更新触发器限制为仅更新更新的行而不是整个表?
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。
答案 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