Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 更改后删除后的触发器不起作用_Sql Server_Tsql_Triggers - Fatal编程技术网

Sql server 更改后删除后的触发器不起作用

Sql server 更改后删除后的触发器不起作用,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我使用MicrosoftSQLServerManagementStudio在T-SQL中编写了一个触发器,在注意到一个缺陷后,我缩小了触发器的范围。这使得我的一个触发器停止工作,我不知道为什么 工作流应该是这样的:删除事件,通过EventId上的外键,删除EventEquipment。由于不再需要设备,因此需要的设备数量应添加回名为EquipmentAvailabilities的表中的设备可用性 下面是我的代码。我在插入工作时降低了可用性,并在删除工作后增加了可用性,直到我添加到该日期为止 cr

我使用MicrosoftSQLServerManagementStudio在T-SQL中编写了一个触发器,在注意到一个缺陷后,我缩小了触发器的范围。这使得我的一个触发器停止工作,我不知道为什么

工作流应该是这样的:删除事件,通过EventId上的外键,删除EventEquipment。由于不再需要设备,因此需要的设备数量应添加回名为EquipmentAvailabilities的表中的设备可用性

下面是我的代码。我在插入工作时降低了可用性,并在删除工作后增加了可用性,直到我添加到该日期为止

create trigger trgAddNumberAvailable
on EventEquipments
after delete
as
begin

    declare @eventEquipmentId int;

    select @eventEquipmentId = EventEquipmentId
    from deleted;

    declare @eventId int;

    select @eventId = EventId
    from deleted;

    --selects the eventID from EventEquipment

    declare @eventDate date;

    select @eventDate = EventDate
    from Events 
    where Events.EventId = @eventId;
   --finds the date for the Event that was chosen above becuase EventEquipment does not contain date

    declare @equipmentId int;

    select @equipmentId = EquipmentId
    from deleted
    where deleted.EventEquipmentId = @eventEquipmentId;

    declare @numberRequested int;

    select @numberRequested = NumberOfEquipmentNeeded
    from deleted 
    where deleted.EventEquipmentId = @eventEquipmentId;

    update EquipmentAvailabilities
    set NumberAvailable = NumberAvailable + @numberRequested
    where EquipmentId = @equipmentId  
      and EquipmentAvailabilityDate = @eventDate;

    --will update the availability for the equipment from insert and the date it is
    --available that was chosen from the Event date from the event that was deleted

你已经用了很多次了选择。。从删除只是为了填充变量。 而是使用一个选择并填充所有变量

还要注意另一个查询。表之间的关系不清楚

create trigger trgAddNumberAvailable
on EventEquipments
after delete
as
begin

    declare @eventEquipmentId int;
    declare @eventId int; 
    declare @eventDate date;
    declare @equipmentId int;
    declare @numberRequested int;

    select @eventEquipmentId = EventEquipmentId, @eventId = EventId
    ,@equipmentId = EquipmentId,@numberRequested = NumberOfEquipmentNeeded
    from deleted;

     --selects the eventID from EventEquipment
      select @eventDate = EventDate
    from Events 
    where Events.EventId = @eventId;
   --finds the date for the Event that was chosen above becuase EventEquipment does not contain date

    update EquipmentAvailabilities
    set NumberAvailable = NumberAvailable + @numberRequested
    where EquipmentId = @equipmentId  
      and EquipmentAvailabilityDate = @eventDate;

    --will update the availability for the equipment from insert and the date it is
    --available that was chosen from the Event date from the event that was deleted

    --OR (alternative query for bulk delete ,(Correct the join))
    update EquipmentAvailabilities
    set NumberAvailable = NumberAvailable + @numberRequested
    from EquipmentAvailabilities EA
    inner join   deleted d
    on ea.EquipmentId = d.equipmentId  
    inner join Events E 
    on d.EventId=e.EventId
    where 
      ea.EquipmentAvailabilityDate = e.eventDate;

您的触发器有一个主要缺陷,您似乎认为它每行调用一次,但事实并非如此。每个语句触发一次触发器,因此如果DELETE语句影响25行,则触发一次触发器,但删除的伪表将包含25行。您的代码将在此处选择这25行中的哪一行??从已删除中选择@eventEquipmentId=eventEquipmentId;-这是不确定的,您将得到一个任意行,而忽略所有其他行。你需要重写你的触发器来考虑这一点!delete语句一次只影响一行。它可能正在删除一行,但您应该为批量删除做好准备。另外,新开发人员不知道所有这些事情,所以在重要的业务规则中,您应该格外小心。此外,当您有这么多id时,那么eventdate需要什么?表关系中似乎没有什么问题。您可以复制粘贴触发脚本在SSMS中,而不是删除put实际表名。这样您可以调试它。