2016-11-16 3 views
0

J'ai une base de données de vol avec plusieurs tables. J'essaye de faire un déclencheur pour refuser une insertion ou une mise à jour sur un vol qui a une demande de maintenance. Si l'avion est demandé pour l'entretien, il ne devrait pas y avoir de vol entre ces heures. Je reçois le message d'erreur très bien, mais il semble que je l'obtiens toujours. Comment venir? Merci d'avance, j'apprécie toujours l'aide.Déclenchement avec deux tables

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

Quelles sont les valeurs de f.DepartureDateID, m.TargetEndDate et m.StartDate, est f.DepartureDateID vraiment une date dans le même format que les autres? – grom

+0

Ce sont tous des types datetime. J'essaie de faire un vol en 2020, où toutes mes demandes de maintenance sont en 2016, et je reçois toujours mon message d'erreur de déclenchement. – th30d0rab1e

+0

2016-09-16 08: 30: 00.000 Début - 2016-09-17 09: 30: 00.000 Fin. Est une date de demande de maintenance. Si j'utilise cette insertion sur une date, obtenez toujours le message d'erreur. '20200916 09:00:00 AM' – th30d0rab1e

Répondre

0

La question ci-dessus se produit parce que vous manque la clause IF et vous joignez le tableau de vol complet, à savoir si Atlease un vol correspond à la vôtre critères que vous allez obtenir l'erreur. pour la mise en œuvre correcte, vous devez joindre à la place inserted.PlaneID comme je l'ai indiqué ci-dessous

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

insérer dans les valeurs de vol (304, 3, 1, 200192, 1, '20200916 09:00:00 AM'); J'ai essayé d'utiliser l'année 2020 dans un vol et j'ai toujours l'erreur, toutes mes demandes de maintenance sont dans l'année 2016. – th30d0rab1e

+0

inserted.PlaneID est redlined, et theres deux clauses où. N'aurais-je pas deux 'et'? – th30d0rab1e

+0

Je dois rejoindre la table insérée, ajouté que maintenant. – Surendra

0

J'espère que vous l'avez résolu maintenant, mais sinon je peux essayer d'aider. Essayez de le faire comme ça, je l'ai essayé localement juste avec une requête vrai/faux et cela devrait fonctionner tant que votre requête est correcte, je ne suis pas sûr de l'endroit où il est le plus correct de mettre la restauration en route, maintenant je mettez-le dans la fonction catch mais peut-être que c'est mieux avant le 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;