0

テーブルの行を挿入または更新する前にトリガーとして呼び出される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」が発生します。この関数の何が問題になっていますか?

4

1 に答える 1

0

おそらく、除外制約btree_gistを使用して、カスタム psql トリガーなしでこれを行うことができます

これは、あなたが望むことのほとんどを行う別の質問です。

Postgres の日付重複制約

于 2012-12-28T23:40:56.680 に答える