我的数据库中有三个表:
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
答案 0 :(得分:1)
好吧,你正在写一个INSTEAD OF
触发器 - 这意味着INSERT
reservation
不会发生,除非你在触发器中写一个 - 你需要写一个触发器内的新INSERT
语句。
我不会尝试为您编写更正的版本,因为还存在与多行插入相关的其他问题 - inserted
可以包含多行。
这意味着a)您不应该执行= (select x from inserted)
,因为该子查询可能返回多个值,并且您将收到运行时错误。并且b)您可能遇到某些行有效且某些无效的情况。我不确定你会如何打破这个问题,所以这就是为什么我不是在替换它。
最后,当然,(正如评论中所提到的)这是一个你已经设定的毫无意义的练习,因为对两列的UNIQUE
约束比你写的任何东西都要好得多。触发。