SQL Server 数据库服务器:更新触发器不在日期之间

gk7wooem  于 2022-11-28  发布在  其他
关注(0)|答案(1)|浏览(109)

我正在创建一个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,数据不会更改。
但这是行不通的,它更新了一个重叠的日期知道为什么吗?泰

vfh0ocws

vfh0ocws1#

你真的不想在一个语句中完成这个过程。如果有任何行违反了规则,那么整个批处理应该失败。因此,首先对目标表检查INSERTED,如果没有发现违规,那么就更新。

create or alter trigger instead_update_promotion
on GHOST_PROMOTIONS
instead of update
as 
begin
    if exists (
    select *
    from inserted i, GHOST_PROMOTIONS p
    where 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)
      )
      begin
         throw 51000, 'Cannont have overlapping promotions for the the same store', 1;
      end

      --update here
end

相关问题