2012-02-21 6 views
1

PL/pgSQLトリガ機能の作成を開始しました。私は学生と結果と呼ばれるテーブルのカップルを持っています。次の列を持つ生徒。 ID、名前、件名、マーク(IDが主キーである)および結果表がID、一つのレコードは、学生のテーブルに追加されているときはいつでもPostgreSQLトリガーファンクションのプライマリキー値にアクセスできない

は、私が欲しいステータスのような2つの列を持っていますStudentテーブルのマークをチェックしてResultテーブルを更新するには、入力したマークが50より大きい場合、IDとStatus = PassのResultテーブルに1つのレコードを挿入し、50未満の場合はステータスが失敗します。 は、私はハード主キーの値をコード化しているので、期待通りに働いているこの機能をトリガすることにより、この


CREATE OR REPLACE FUNCTION "UpdateResult"() RETURNS trigger AS $BODY$ 
    BEGIN 
    IF NEW.mark < 50 THEN 
     INSERT INTO "Result" SELECT 92,'fail'; 
     RETURN NEW; 
    ELSE 
INSERT INTO "Result" SELECT 92,'pass'; 
RETURN NEW; 
END IF;  
    END; 
    $BODY$ 
     LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER 
     COST 100; 
    ALTER FUNCTION "UpdateResult"() OWNER TO postgres; 

CREATE TRIGGER "Result" 
    AFTER INSERT 
    ON "Student" 
    FOR EACH ROW 
    EXECUTE PROCEDURE "UpdateResult"(); 

を達成するために、次のトリガ機能を持っています。 しかし、私は "結果" NEW.IDをSELECT INTO次

INSERTのようなトリガ関数内でSQLを変更すると、 '失敗します';(または) INSERT INTO "結果" SELECT NEW.ID、 'pass';

それは

> ***Record "new" has no field "id" Context : PL/pgSQL function 
> "UpdateResult" line 3 at SQL statement*** 

のようなエラーがスローされ、新たな変数ではない主キーの値から非プライマリキー値の値をとることが可能であることを意味します。 PL/pgSQLに制限があるのか​​、間違っているのですか?

+2

は、「ID」フィールドの総額を確認してください - それは大文字でいた場合、あなたはそれを(それを引用することによって)と同じ方法を使用する必要があります。 INSERTの結果」INTO "新しい選択。" ID "、NEW.name; –

+0

こんにちはMilen。はい、それは大文字で、引用符を追加した後に動作しています。私はこのようにする必要がある理由をお知らせください。 – Murugesh

+0

[識別子とキーワード](http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS)は、 "quoted identifier"を探します。 –

答えて

1

ヒント:引用符で囲まれた名前はなぜ使用していますか?これを行うときには、大文字を気にする必要があります。

これが動作するかどうかを参照してください:

CREATE OR REPLACE FUNCTION UpdateResult() RETURNS trigger AS $BODY$ 
    BEGIN 
    IF NEW.mark < 50 THEN 
     INSERT INTO result (id, status) values (92,'fail'); 
     RETURN NEW; 
    ELSE 
     INSERT INTO result (id, status) values (92,'pass'); 
     RETURN NEW; 
END IF;  
    END; 
    $BODY$ 
     LANGUAGE 'plpgsql' VOLATILE STRICT SECURITY DEFINER 
     COST 100; 
    ALTER FUNCTION UpdateResult() OWNER TO postgres; 

CREATE TRIGGER Result 
    AFTER INSERT 
    ON Student 
    FOR EACH ROW 
    EXECUTE PROCEDURE UpdateResult(); 
関連する問題