2016-05-24 5 views
-1

私は、単純なPostgreSQLのテーブルこのトリガーはなぜ機能しませんか?

Flight (id, pilot, copilot) 

を持っていると私は、もちろん1つの人は両方で行うことはできませんので、パイロット=共同パイロットを持つレコードを作成しないようにトリガーを追加したい:D

Iこれを試しました:

CREATE FUNCTION controllaPiloti() RETURNS TRIGGER AS $$ 
BEGIN 
IF (SELECT pilot FROM flight WHERE pilot = new.pilot AND copilot = new.pilot) 
THEN RAISE EXCEPTION 'Pilot and copilot must be different!'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE 'plpgsql'; 
CREATE TRIGGER checkPiloti 
BEFORE INSERT ON flight FOR EACH ROW 
EXECUTE PROCEDURE controllaPiloti(); 

ただし、動作しません。

私には何が欠けていますか?

+1

'動作しません'を定義 – sagi

+0

データベースに既に存在するデータをチェックし、現在のデータが挿入される前にデータを実行します。これはうまくいかない。 Read http://www.postgresql.org/docs/9.1/static/plpgsql-trigger.html –

+0

が機能しないということは、パイロットとコピロットの列に同じ値を持つレコードを作成できることを意味します。また、EXISTSを削除しようとしましたが、結果はありません – NoobNe0

答えて

1

私は問題を自分で解決しましたが、気にしません。

これは、作品の魅力のよう

右トリガー

CREATE FUNCTION controllaPiloti() RETURNS TRIGGER AS $$ 
BEGIN 
IF (new.comandante = new.vice) 
THEN RAISE EXCEPTION 'Comandante e vice non possono coincidere!'; 
END IF; 
RETURN NEW; 
END; 
$$ LANGUAGE 'plpgsql'; 
CREATE TRIGGER checkPiloti 
BEFORE INSERT ON viaggio FOR EACH ROW 
EXECUTE PROCEDURE controllaPiloti(); 
です。

+0

新しい値を挿入したくない場合は、 'NULL'を返す必要があります。ただ例外を発生させるだけでは不十分です。 – gnerkus

+1

私の場合、例外を発生させると、DB内に新しいレコードが挿入されなくなります – NoobNe0

関連する問題