0

データベースに3つのテーブルがあります。

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

ただし、このスクリプトは正しく機能しません。別の日付と別の部屋に予約を追加すると、カーソルが原因で行った変更が行われません。

これは私が2回目に試したコードです:

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-つまり、トリガーにトリガーを書かない限り、INSERTto theは発生しません-トリガー内に新しいステートメントreservationを書く必要があります。INSERT

複数行の挿入に関連する他の問題があるため、修正版を書くつもりはありませんinserted。複数の行を含めることができます。

これは、a)= (select x from inserted)サブクエリが複数の値を返す可能性があり、実行時エラーが発生する可能性があるため、実行しないでください。b)一部の行が有効で、一部が無効であるという状況が発生する場合があります。その問題をどのように分解したいのかわかりません。そのため、私は代替案を書いていません。

そして最後に、もちろん (コメントで述べたように) これは設定された無意味な演習です。なぜなら、UNIQUE2 つの列に対する制約は、トリガーに記述したものよりもはるかにうまく機能するからです。

于 2013-03-11T11:01:11.590 に答える