0

我的数据库中有三个表:

Room (num PK, seats, reservation price)
Reservation (num PK, client id FK Client(id), room number FK Room(num), reservation date)
Client (id PK, name)

我想在预订之前,我们检查房间是否没有使用触发器。

这是我试过的脚本:

CREATE TRIGGER Verify_room_taken ON reservation
INSTEAD OF INSERT
AS
    BEGIN
        IF EXISTS ( SELECT * FROM reservation
                    WHERE [room number] = (SELECT [room number] FROM INSERTED)
                    AND [reservation date] = (SELECT [reservation date] FROM INSERTED))
        ROLLBACK TRAN
    END

但是这个脚本不能正常工作,当我在不同的日期和不同的房间添加预订时,它不会因为光标而做出我所做的更改。

这是我第二次尝试的代码:

ALTER TRIGGER Verifier_chambre_prise ON reservation
INSTEAD OF INSERT
AS
    BEGIN
        IF NOT EXISTS ( SELECT * FROM reservation
                    WHERE [n° de chambre] = (SELECT [n° de chambre] FROM INSERTED)
                    AND [date de réservation] = (SELECT [date de réservation] FROM INSERTED))
            INSERT INTO reservation  SELECT * FROM INSERTED
    END
4

1 回答 1

1

好吧,您正在编写一个INSTEAD OF触发器-这意味着除非您在触发器中INSERT写入reservation一个触发器,否则不会发生-您需要在触发器中编写一个新INSERT语句。

我不会尝试为您编写更正的版本,因为还有其他与多行插入相关的问题 -inserted可以包含多行。

这意味着 a) 您不应该这样做= (select x from inserted),因为该子查询可能会返回多个值,并且您会收到运行时错误。并且 b) 您可能会遇到某些行有效而某些行无效的情况。我不确定你想如何分解这个问题,所以这就是我不写替代品的原因。

最后,当然,(如评论中所述)这是您设置的毫无意义的练习,因为UNIQUE对两列的约束会比您在触发器中编写的任何内容做得更好。

于 2013-03-11T11:01:11.590 回答