2016-11-16 79 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;