2016-12-01 3 views
0

私のプロジェクトでは、私は2人の関係があります。
1.祭り(タイトル、START_DATE、END_DATE)
2.イベント(タイトルEVENT_DATE

PL/pgSQLのトリガ挿入アップデートのみ有効タプル

私はEVENT_DATEが対応する祭りでSTART_DATEとEND_DATEの間に設定されている場合、新しいタプルを挿入し、\、イベント関係に更新されるたびにチェックし、トリガーを追加する必要があります。
イベント行が無効な場合、トリガーは通知を発行する必要があります。それ以外の場合は、タプルを定期的に挿入または更新する必要があります。
私は(PL/pgSQLで)作られたトリガ:

create function trigf() returns trigger as $$ 
begin 
if((NEW.event_date) < (select start_date from festival where festival.title = NEW.title) or 
    (NEW.event_date) > (select end_date from festival where festival.title = NEW.title)) then 
    raise notice 'The new event date is invalid'; 
end if; 
return null; 
end; 
$$language plpgsql; 

create trigger T 
before insert or update on event 
for each row 
    execute procedure trigf(); 

問題は、私の機能が無効な日付を検出することが可能であるということですが、それは、\更新有効なタプルを挿入しません。
これを達成するために、私のトリガーで何を変更する必要がありますか?

答えて

0

以下を行う必要があります。

  • raise 'The new event date is invalid'代わりのraise notice 'The new event date is invalid'無効な日付にエラーを強制代わり の単なるのみ記録され、その後、無視され、気づくこと。

行レベルは、この行(すなわち、後続のトリガが発射されていないため、操作の残りの部分をスキップするようにトリガマネージャに信号を送るためにnullを返すことができる前に発生トリガ、:

  • return NEW、ないreturn NULLこの行に対してはINSERT/UPDATE/DELETEは発生しません)。

  • +0

    ありがとうございました!しかし、1つの質問:私が 'raise notice'の代わりに 'raise notice'を使用し、無効な行があると、行挿入の試みはすべてキャンセルされますが、無効な行の挿入を取り消したいだけです。だから私はそれを「育てる」ことでどうすることができますか? –

    +0

    エラーを無視してはいけません。ごめんなさい。しかし、あなたが本当に必要なのであれば、単にraiseを取り除いて 'if ... then NULLを返します。それ以外の場合はNEWを返します。終了if; – Tometzky

    関連する問題