J'ai le déclencheur suivant;SQL Server 2008 déclencheur ne fonctionne pas correctement avec plusieurs insertions
CREATE TRIGGER trFLightAndDestination
ON checkin_flight
AFTER INSERT,UPDATE
AS
BEGIN
IF NOT EXISTS
(
SELECT 1
FROM Flight v
INNER JOIN Inserted AS i ON i.flightnumber = v.flightnumber
INNER JOIN checkin_destination AS ib ON ib.airport = v.airport
INNER JOIN checkin_company AS im ON im.company = v.company
WHERE i.desk = ib.desk AND i.desk = im.desk
)
BEGIN
RAISERROR('This combination of of flight and check-in desk is not possible',16,1)
ROLLBACK TRAN
END
END
Ce que je veux que le déclencheur à faire est de vérifier les tables de vol, checkin_destination et checkin_company quand un nouveau record pour checkin_flight est ajouté. Chaque enregistrement de checkin_flight contient un numéro de vol et un numéro de bureau où les passagers doivent s'enregistrer pour cette destination. Les tables checkin_destination et checkin_company contiennent des informations sur les entreprises et les destinations réservées à certains bureaux d'enregistrement. Lors de l'ajout d'un enregistrement à checkin_flight j'ai besoin d'informations de la table de vol pour obtenir la destination et flightcompany avec le numéro de vol inséré. Cette information doit être vérifiée par rapport aux combinaisons d'enregistrement disponibles pour les vols, les destinations et les compagnies.
J'utilise le déclencheur comme indiqué ci-dessus, mais lorsque j'essaie d'insérer une mauvaise combinaison, la gâchette le permet. Qu'est-ce que j'oublie ici?
EDIT 1: J'utilise l'instruction d'insertion multiple suivant
INSERT INTO checkin_flight VALUES (5315,3),(5316,3),(5316,2)
//5315 is the flightnumber, 3 is the desknumber to checkin for that flight
EDIT 2: Testés une seule insertion de la ligne qui est impossible, l'erreur est lancée correcte. Donc, c'est l'insertion multiple qui semble donner le problème.
Merci chris! Cela a fait l'affaire, devinez que je dois m'entraîner un peu plus dans la pensée logique – Rob
Une petite question, pourquoi une jointure gauche et pas une jointure interne? parce que le bureau peut être vide? – Rob
Je faisais l'hypothèse que le cas négatif était lorsque l'enregistrement correspondant dans checkin_destination ou checkin_company n'existe pas; Vérifier que quelque chose n'existe pas est fait par LEFT JOINing à la table, puis ne recherche aucun enregistrement (d'où la partie "im.desk IS NULL"). C'est juste une supposition, et vous devriez modifier pour le corriger. L'objectif, comme je l'ai dit, est de faire en sorte que votre requête trouve des enregistrements dans INSERTED qui ne sont pas valides. –