sql server 2008在2个表上多次插入

sql server 2008在2个表上多次插入,sql,sql-server-2008,triggers,insert,Sql,Sql Server 2008,Triggers,Insert,我在SQLServer2008数据库上得到了以下触发器 CREATE TRIGGER tr_check_stoelen ON Passenger AFTER INSERT, UPDATE AS BEGIN IF EXISTS( SELECT 1 FROM Passenger p INNER JOIN Inserted i on i.flight= p.flight

我在SQLServer2008数据库上得到了以下触发器

CREATE TRIGGER tr_check_stoelen
ON Passenger
AFTER INSERT, UPDATE
AS
BEGIN
        IF EXISTS(
                SELECT 1
                FROM Passenger p 
                INNER JOIN Inserted i on i.flight= p.flight
                WHERE p.flight= i.flightAND p.seat= i.seat
             )
        BEGIN
            RAISERROR('Seat taken!',16,1)
            ROLLBACK TRAN   
        END
END
当我尝试运行下面的查询时,触发器正在抛出错误。这个查询我想在两个不同航班的数据库中插入两个不同的乘客。我肯定两个座位都没有人,但我不明白为什么触发器会给我错误。它是否与相关性有关

INSERT INTO passagier VALUES 
(13392,5315,3,'Janssen Z','2A','October 30, 2006 10:43','M'),
(13333,5316,2,'Janssen Q','2A','October 30, 2006 11:51','V')
更新: 表如下所示

CREATE TABLE Passagier
(
    passengernumber int NOT NULL CONSTRAINT PK_passagier PRIMARY KEY(passagiernummer),
    flight int NOT NULL CONSTRAINT FK_passagier_vlucht REFERENCES vlucht(vluchtnummer) 
        ON UPDATE NO ACTION ON DELETE NO ACTION,
    desk int NULL CONSTRAINT FK_passagier_balie REFERENCES balie(balienummer) 
        ON UPDATE NO ACTION ON DELETE NO ACTION,
    name varchar(255) NOT NULL,
    seat char(3) NULL,
    checkInTime datetime NULL,
    gender char(1) NULL
)

如果您在插入一条记录后运行触发器,然后查找具有刚才插入的值的记录,您将始终找到它。您可以尝试使用INSTEAD OF触发器,以便在实际执行插入之前检查现有记录。

如果在插入记录后运行触发器,然后查找具有刚插入的值的记录,您将始终找到它。您可以尝试一个INSTEAD OF触发器,以便在实际执行插入操作之前检查现有记录。

它可能是在表中发现自己而抛出错误(循环引用回自身)。您可能希望在where子句中添加一个额外的筛选器,如“AND Passenger.ID inserted.ID”

它可能会通过在表中查找自身而抛出错误(循环引用回自身)。您可能希望向where子句添加一个附加筛选器,如“AND Passenger.ID inserted.ID”

此子查询存在一些问题:

SELECT 1
FROM Passenger p 
INNER JOIN Inserted i on i.flight= p.flight
WHERE p.flight= i.flight AND p.seat= i.seat
首先,p.flight=i.flight的
是非常不必要的,因为它已经是您加入的一部分了

其次,
p.seat=i.seat
也应该是
JOIN
的一部分

第三,此触发器在插入行后运行,因此它将始终匹配,因此您的触发器将始终引发错误并回滚

您可以修复触发器,但更好的方法是根本不使用触发器。如果我理解您正试图正确执行的操作,您只需要对
航班、座位设置
唯一的
约束:

ALTER TABLE passgier
ADD CONSTRAINT IX_passagier_flightseat
UNIQUE (flight, seat)

此子查询存在一些问题:

SELECT 1
FROM Passenger p 
INNER JOIN Inserted i on i.flight= p.flight
WHERE p.flight= i.flight AND p.seat= i.seat
首先,p.flight=i.flight的
是非常不必要的,因为它已经是您加入的一部分了

其次,
p.seat=i.seat
也应该是
JOIN
的一部分

第三,此触发器在插入行后运行,因此它将始终匹配,因此您的触发器将始终引发错误并回滚

您可以修复触发器,但更好的方法是根本不使用触发器。如果我理解您正试图正确执行的操作,您只需要对
航班、座位设置
唯一的
约束:

ALTER TABLE passgier
ADD CONSTRAINT IX_passagier_flightseat
UNIQUE (flight, seat)

请问表格的结构是什么?对不起,荷兰语和英语混在一起了。但我在荷兰工作,只是为了更好的理解这里的翻译;-)请问表格的结构是什么?对不起,荷兰语和英语混在一起了。但我在荷兰工作,只是为了更好的理解这里的翻译;-)一个触发器似乎不起作用。我刚试过,ManagementStudio说“2行受影响”,但什么也没发生。您是否在触发器中再次插入了?使用INSTEAD OF触发器,您必须在触发器中进行实际插入(如果数据通过测试)。不管怎样,我看到阿洛纳的好主意对你起了作用,所以这是个好消息。一个触发装置似乎不起作用。我刚试过,ManagementStudio说“2行受影响”,但什么也没发生。您是否在触发器中再次插入了?使用INSTEAD OF触发器,您必须在触发器中进行实际插入(如果数据通过测试)。不管怎么说,我知道Aaronaught的好主意对你有用,所以这是个好消息。我正在尝试用一个insert语句插入两个(或更多)乘客。示例中的乘客乘坐不同的航班。我会用索引试试你的建议。好的,没想到@感谢您的快速和良好的响应!这似乎是解决与索引!谢谢你的建议。我想做的是用一个insert语句插入两个(或更多)乘客。示例中的乘客乘坐不同的航班。我会用索引试试你的建议。好的,没想到@感谢您的快速和良好的响应!这似乎是解决与索引!谢谢你的建议。