2016-11-16 77 views
0

我有一个有多个表的航班数据库。我试图做出触发条件,拒绝在有维护请求的航班上插入或更新。如果要求维修飞机,则在这些时间之间不应有飞行。我得到的错误信息很好,但似乎我总是得到它。怎么来的?在此先感谢,我总是感谢帮助。触发两张表

alter trigger DateMaintenanceTrigger 
on Flight 
after update, insert 
as 
    select 
     m.StartDate, m.TargetEndDate, f.DepartureDateID 
    from 
     Maintenance.MaintenanceRequest as m 
    inner join 
     Flight as f on f.PlaneID = m.PlaneID 
    where 
     f.DepartureDateID < m.TargetEndDate 
     and f.DepartureDateID > m.StartDate 

    begin 
     raiserror ('Flight cannot take place on this maintentance date, plane not ready.', 16,1); 
     rollback transaction; 
     return 
    end; 
    go 


insert into Flight 
values (304, 3, 1, 200192, 1, '20160916 09:00:00 AM'); 
+0

什么是f.DepartureDateID,m.TargetEndDate和m.StartDate的价值观,是f.DepartureDateID真的是在相同的格式别人约会吗? – grom

+0

他们都是日期时间类型。我试图在2020年完成一次航班,我的所有维护请求都是在2016年,而且我仍然收到了我的触发器错误消息。 – th30d0rab1e

+0

2016-09-16 08:30:00.000开始 - 2016-09-17 09:30:00.000结束。是维护请求日期。如果我在日期中使用此插入,仍然会收到错误消息。 '20200916 09:00:00 AM' – th30d0rab1e

回答

0

上述问题发生,因为你缺少IF子句,你也与完整的飞行表,如果atlease一个符合飞行标准,你你会得到错误的加盟,即。为正确执行则需要与inserted.PlaneID加入,而不是因为我已经证明下面

alter trigger DateMaintenanceTrigger on Flight 
after update, insert 
as 
IF EXISTS (
select m.StartDate, m.TargetEndDate, f.DepartureDateID 
from Maintenance.MaintenanceRequest as m 
JOIN inserted as i 
ON i.PlaneID = m.PlaneID 
and i.DepartureDateID < m.TargetEndDate and i.DepartureDateID > m.StartDate 
) 
    begin 
     raiserror ('Flight cannot take place on this maintentance date, plane not ready.', 16,1); 
     rollback transaction; 
     return 
    end; 
    go 



insert into Flight values (304, 3, 1, 200192, 1, '20160916 09:00:00 AM'); 
+0

insert into Flight values(304,3,1,200192,1,'20200916 09:00:00 AM'); 我尝试在一个航班中使用2020年,我仍然得到错误,我的所有维护请求都在2016年。 – th30d0rab1e

+0

inserted.PlaneID是红线,并且theres两个where子句。我不会有两个'和'? – th30d0rab1e

+0

我必须加入插入的表格,现在添加。 – Surendra

0

我希望你解决它现在,但如果没有,我可以尽力帮助。试着这样做,我试着在本地只是一个真/假的查询,它应该工作,只要你的查询是好的,我不知道在哪里是最正确的方式把回滚,现在我把它放在catch函数中,但可能在raiserror()之前更好。

alter trigger DateMaintenanceTrigger 
on Flight 
after update, insert 
as 

BEGIN TRY 
    IF EXISTS(
     select 
      m.StartDate, m.TargetEndDate, f.DepartureDateID 
     from 
      Maintenance.MaintenanceRequest as m 
     inner join 
      Flight as f on f.PlaneID = m.PlaneID 
     where 
      f.DepartureDateID < m.TargetEndDate 
      and f.DepartureDateID > m.StartDate 
    ) 
    BEGIN 
     raiserror ('Flight cannot take place on this maintentance date, plane not ready.', 16,1); 
    END 
    ELSE 
    BEGIN 
     insert into Flight values (304, 3, 1, 200192, 1, '20160916 09:00:00 AM'); 
    END 
END TRY 
BEGIN CATCH 
    DECLARE @ErrorMessage NVARCHAR(4000); 
    DECLARE @ErrorSeverity INT; 
    DECLARE @ErrorState INT; 

    SET @ErrorMessage = ERROR_MESSAGE(); 
    SET @ErrorSeverity = ERROR_SEVERITY(); 
    SET @ErrorState = ERROR_STATE(); 

    rollback transaction; 

    RAISERROR (@ErrorMessage, 
       @ErrorSeverity, 
       @ErrorState 
       ); 
END CATCH;