2010-04-27 64 views
1

多個插入我得到了以下觸發我的SQL Server 2008數據庫SQL Server 2008中超過20桌

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') 

UPDATE: 表看起來如下

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 
) 
+0

什麼是表模式嗎? – gbn 2010-04-27 18:45:10

+0

對於荷蘭語和英語的混合感到抱歉。但我在荷蘭工作,只爲了更好的理解在這裏翻譯;-) – Rob 2010-04-27 18:58:13

回答

6

沒有與此子查詢的幾個問題:

SELECT 1 
FROM Passenger p 
INNER JOIN Inserted i on i.flight= p.flight 
WHERE p.flight= i.flight AND p.seat= i.seat 

首先,在WHERE p.flight = i.flight是非常不必要的,因爲它已經是你的加入的一部分。

其次,p.seat = i.seat也應該是JOIN的一部分。

第三,這觸發運行後的行已經插入,所以這將總是的比賽,你的觸發器將因此總是引發錯誤並回滾。

您可以修復觸發器,但更好的方法是根本不使用觸發器。如果我理解你想要正確地做什麼,你需要的是一個UNIQUE約束上flight, seat

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

我想要做的是插入兩個(或更多)乘客一個插入語句。示例中的乘客在不同的航班上。 我會試試你的建議與索引。好的,從來沒有想過它! – Rob 2010-04-27 18:57:27

+0

@Aaronaught感謝您的快速和良好的迴應!它似乎與索引解決!感謝您的提示。 – Rob 2010-04-27 19:05:39

2

如果你插入一條記錄後,運行的觸發,然後尋找與您剛插入的值的記錄,你總能找到它。您可以嘗試使用INSTEAD OF觸發器,以便在實際插入之前檢查現有記錄。

+0

觸發intead似乎並沒有工作。我只是試了一下,管理工作室說'2行受到影響',但沒有任何反應 – Rob 2010-04-27 18:54:15

+0

您是否在觸發器中再次插入?使用INSTEAD OF觸發器時,您必須在觸發器內執行實際的插入操作(如果數據通過了您的測試)。無論如何,我看到Aaronaught的好主意適合你,所以這是個好消息。 – Ray 2010-04-27 19:33:42

0

它可能會通過在表格中找到自身來引發錯誤(循環引用回自己)。您可能需要額外的過濾器添加到像在where子句「和Passenger.ID <> inserted.ID」