我有以下触发工作正确;SQL Server 2008中触发不能与多个刀片
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
我想触发做的是检查表飞行,checkin_destination和checkin_company时添加checkin_flight的新纪录。 checkin_flight的每个记录都包含一个航班号和一个桌号,乘客需要为此目的地办理登机手续。 的表格checkin_destination和checkin_company包含约仅限于某些签入课桌公司和目的地的信息。在向checkin_flight添加记录时,我需要从航班表中获取信息以获取插入航班号的目的地和航班公司。这些信息需要根据航班,目的地和公司的可用登记组合进行检查。
我使用的触发如上所述,但是当我尝试插入错误的组合触发允许它。我在这里错过了什么?
编辑1: 我使用下面的多个插入语句
INSERT INTO checkin_flight VALUES (5315,3),(5316,3),(5316,2)
//5315 is the flightnumber, 3 is the desknumber to checkin for that flight
编辑2: 测试单行插入这是不可能的,那么被抛出纠正错误。所以这是多重插入似乎给出了问题。
谢谢克里斯!这就是诀窍,我猜想我需要在逻辑思维上进一步训练 – Rob 2010-05-03 18:32:30
一个小问题,为什么左连接而不是内连接?因为桌子可以是空的? – Rob 2010-05-03 20:20:08
我假设负面情况是checkin_destination或checkin_company中的相应记录不存在的情况;检查一些不存在的内容是通过LEFT JOINing对表进行的,然后查找没有记录(因此“im.desk IS NULL”部分)。这只是一个假设,你应该调整以纠正它。我所说的目标是让您的查询找到INSERTED中无效的任何记录。 – 2010-05-04 00:03:20