2017-05-31 1 views
1

こんにちは趣味目的私はホテルシステムを再構築するMS SQL Serverデータベースを使用してC#アプリケーションを作成しようとしています。私は今datedifferenceを計算するSQLトリガを作成しようとしています。ご予約は6週間(42日)を超えることはできません。しかし、たとえその差が1日であっても、42日より短い日程の予約をしても、私の引き金は消えます。私は何が間違っているのか分かりません。datediffをカウントするトリガー

マイトリガー:

create trigger trigger_reservation 
on reservation 
after update, insert 
as 
if exists 
(
select reservationid, DATEDIFF(dd,Startdate,Enddate) 
from reservation 
group by reservationid, enddate, startdate 
having DATEDIFF(dd,Startdate,Enddate) > 42 
) 
begin 
    raiserror('Error: Reservation may not be longer than 6 weeks',16, 1) 
    rollback transaction 
end 
+0

あなたのトリガーは挿入している行だけではなく、全体のテーブルをチェックしていますか?データテーブルに既に42日以上の予約がある場合、トリガーは常に起動します。 –

+0

あなたは正しいです、確かに42日より長いいくつかの予約があります(ランダムに生成されたデータ)。これを修正するにはどうしたらいいですか? – glnxhjeh

+0

基本的には、トリガーでアクセスできる「特別な」テーブルについて知っておく必要があります。ここでは、「挿入」したいテーブルが必要です。私はpetermが彼の答えを更新したのを見て、それはあなたが必要とする通りに正確に動作するはずです... –

答えて

3

トリガを実行し、維持するのに費用がかかります。チェックのこのタイプは、ここで

そして、ここではあなたがここでトリガー

CREATE TRIGGER trigger_reservation 
ON reservation AFTER UPDATE, INSERT 
AS 
    IF EXISTS (
    SELECT * 
     FROM inserted 
    WHERE DATEDIFF(dd, startdate, enddate) > 42 
) 
    BEGIN 
    RAISERROR ('Error: Reservation may not be longer than 6 weeks', 16, 1); 
    ROLLBACK TRANSACTION; 
    RETURN 
END; 

でそれをやって行く方法ですdbfiddleデモがdbfiddleデモですシンプルCHECK CONSTRAINT

CREATE TABLE reservation (
    reservationid INT, 
    startdate DATE, 
    enddate DATE, 
    -- ... 
    CONSTRAINT reservation_dates_ck 
    CHECK(DATEDIFF(dd, startdate, enddate) < 43) 
) 

することによって達成することができます

+0

返事をありがとう。私は小切手について知っていますが、テスト目的のために、私はそれが本当にトリガーであることを望みます。 – glnxhjeh

+0

更新された回答を参照 – peterm

+0

これをチェックするには、チェック制約が最適です。ここでトリガーを使用することは、セットベースのソリューションが利用可能な場合にカーソルを使用するようなものです。 –