我正在创建一个SQL而不是更新触发器,因此不可能有一个以上的促销为同一商店与时间重叠。
我的触发器如下所示:
create or alter trigger instead_update_promotion
on GHOST_PROMOTIONS
instead of update
as
begin
update GHOST_PROMOTIONS
set IDSTORE = i.IDSTORE,
STARTDATE = i.STARTDATE,
ENDDATE = i.ENDDATE,
TYPEOFPROMOTION = i.TYPEOFPROMOTION,
STARTINGPRICE = i.STARTINGPRICE,
FINALPRICE = i.FINALPRICE,
PRICEREDUCTIONPERDAY = i.PRICEREDUCTIONPERDAY
from
inserted i, GHOST_PROMOTIONS p
where
i.IDPROMOTION = p.IDPROMOTION
and not (i.IDPROMOTION <> p.IDPROMOTION and i.IDSTORE = p.IDSTORE and (i.STARTDATE between p.STARTDATE and p.ENDDATE or i.ENDDATE between p.STARTDATE and p.ENDDATE))
end
解释我的逻辑:
第一:i.IDPROMOTION〈〉p.IDPROMOTION -〉因此它不与自身进行比较;
第二:i.IDSTORE = p.IDSTORE -〉我们只关心同一商店中的时间重叠;
第三:(i.STARTDATE介于p.STARTDATE和p.ENDDATE之间或i.ENDDATE介于p.STARTDATE和p.ENDDATE之间)-〉如果插入的日期值在已知日期范围内,则为真
这3条语句写在“and not”之后,因此如果3条语句为True(意味着在同一商店中存在与其自身不同且时间重叠的行),则结果为False,数据不会更改。
但这是行不通的,它更新了一个重叠的日期知道为什么吗?泰
1条答案
按热度按时间vfh0ocws1#
你真的不想在一个语句中完成这个过程。如果有任何行违反了规则,那么整个批处理应该失败。因此,首先对目标表检查INSERTED,如果没有发现违规,那么就更新。