更新触发器不会针对基于集合的更新查询中的所有行进行更新

时间:2018-10-09 07:09:20

标签: sql-server triggers sql-update set-based

我有带有以下触发器的城市和国家/地区表:

enter image description here

当我更新任何城市时,它应在“审计”表中插入一行,说明“ ID为'any ID'的城市已被修改”。城市表与国家表具有外键关系(Cities.CountryID = Country.ID)。

我期望trCountryUpdate做的是,当我更新“国家/地区”行时,对于所有具有更新的国家/地区ID的城市,它都应在“审计”表中插入行。

但是,当我更新ID为1的Country的名称时,它应该已经在Audit表中插入了5行,因为CountryID 1有5个对应的城市。但是,它总是插入1行。

请让我知道在更新ID为1的国家/地区时,对于5个ID为1的城市,在审计表中插入5行。

PS:

ALTER trigger [dbo].[trCityUpdate]
on [dbo].[Cities]
for update
as

declare @cityIdModified int;
select @cityIdModified = ID from inserted;
Insert into Audit values ('The City with ID ' + cast(@cityIdModified as varchar(1)) + ' has been modified')

go

ALTER trigger [dbo].[trCountryUpdate]
on [dbo].[Countries]
for update
as

declare @countryIdModified int;
select @countryIdModified = ID from inserted;

update ci
set ci.CountryID = @countryIdModified
from Cities ci 
join Countries co on co.ID = ci.CountryID
where ci.CountryID = @countryIdModified

1 个答案:

答案 0 :(得分:0)

感谢您的所有答复。这是一个很大的帮助:)

ALTER trigger [dbo].[trCityUpdate]
on [dbo].[Cities]
for update
as

Insert into Audit(Text)
select 'The City with ID ' + cast(ID as varchar(1)) + ' has been modified' 
from inserted

更新“城市”表中的5行时,只会调用一次trCityUpdate,而不是5次。插入的表包含5个更新的行。