テーブルの行を挿入または更新する前にトリガーとして呼び出されるpsql関数の作成に問題があります。特定の音楽祭の間に音楽パフォーマンスを保持する「パフォーマンス」。
私が達成したいのは、関数が新しいパフォーマンスbeg_dateとend_dateが既存のパフォーマンスと衝突しないかどうかをチェックすることです。制限は、特定の音楽祭で一度に1つのパフォーマンスしか実行できないことです。
テーブル「パフォーマンス」の構造は次のようになります。
id
beg_date : timestamp
end_date : timestamp
artist_id
music_concert_id
そしてMusic_Festivals:
id
beg_date : timestamp
end_date : timestamp
name
私の関数は次のようになります。
CREATE OR REPLACE FUNCTION check_valid_performance_date() RETURNS TRIGGER AS $check_date$
BEGIN
IF EXISTS (SELECT * from wystep) THEN
IF EXISTS (SELECT 1 FROM wystep WHERE beg_date > NEW.beg_date AND beg_date < NEW.end_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN
RAISE EXCEPTION 'exception 1';
ELSIF EXISTS (SELECT 1 FROM wystep WHERE beg_date < NEW.beg_date AND end_date > NEW.beg_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN
RAISE EXCEPTION 'exception 2 ';
ELSIF EXISTS (SELECT 1 FROM wystep WHERE beg_date <= NEW.beg_date AND NEW.end_date <= end_date AND id_music_festival = NEW.id_music_festival LIMIT 1) THEN
RAISE EXCEPTION 'exception 3 ';
END IF;
END IF;
RETURN NEW;
END
$check_date$ LANGUAGE plpgsql;
そして私のトリガー:
CREATE TRIGGER check_valid_performance
AFTER INSERT OR UPDATE OR DELETE ON Performance
FOR EACH ROW EXECUTE PROCEDURE check_valid_performance_date();
しかし、空のテーブルから始めても、「例外3」が発生します。この関数の何が問題になっていますか?