2016-04-25 14 views
0

だから私はこれらのテーブルがあります。回答と質問。トリガーエラー[plpgsql]

回答テーブルがあります

answerID(PK)

答え

datePosted

questionID

メール

質問表があります

questionID(PK)

質問

datePosted

私が質問に答えるユーザー(電子メール)が属することを確認する電子メール

質問をしたユーザーのユーザーネットワーク(電子メール)。私のユーザーネットワークは、ここにビジネスを持たない別のテーブルから作成することができます。私は、特定のユーザのユーザネットワークを見つける機能を持っています。だから私は、次のコードを書いた:

CREATE OR REPLACE FUNCTION "Social_Network".answers_only_by_users_in_user_network() 
    RETURNS TRIGGER AS 

    $$ 
    begin 
    IF new.email NOT IN (select network_email from  "Social_Network".find_user_network(question.email)) then 
     RAISE EXCEPTION 'user that answered does not belong in user network'; 
     return null; 
    else 
     return new; 
    end if; 
    end; 
    $$ 
    LANGUAGE plpgsql VOLATILE 


    CREATE TRIGGER answer_restriction BEFORE INSERT OR UPDATE ON  "Social_Network".answer 
    for each row execute procedure  "Social_Network".answers_only_by_users_in_user_network(); 

機能find_user_networkは、特定のユーザのユーザネットワークを検索します。 Answerテーブルに対してこのトリガーを作成していますが、関数find_user_networkの入力引数にテーブルQuestionから電子メールを入れたいのでIF文に問題があります。しかし、私のトリガが正しく動作するかどうかを確認するために上記のテーブルからデータを編集しようとすると、エラーが発生します。 エラーは、私はテーブル質問のFROM句のエントリがないことを示しています、そして、それはif文があるトリガ関数の私の3行目を指しています。

私のトリガーは正常に作成され、トリガーも機能します。しかし、そのエラーは持続する。私が間違っていることに関するアイデアは? ありがとう!

答えて

0

PostgreSQLはコンパイル時に埋め込みクエリの構文チェックのみを行います。フルチェック(セマンティック)は実行時です。質問:question.emailは、テーブルに関連する資格の識別子(フォーマットのTableName.ColumnName)があるので、

クエリが

SELECT new.email NOT IN 
    (SELECT network_email 
    FROM "Social_Network".find_user_network(**question**.email)) 

間違っています。しかし、このクエリへの参照は宣言されていません。