2012-02-21 64 views
1

我剛開始編寫PL/pgSQL觸發器函數。我有幾個表稱爲學生和結果。學生有以下欄目。 ID,名稱,主題,標誌(ID是主鍵)和結果表是具有兩列像ID,狀態無法訪問PostgreSQL中的主鍵值觸發函數

每當一個記錄在學生表有加,我想通過檢查Student表中的標記來更新結果表。如果輸入的標記大於50,則應在ID和狀態=通過的結果表中插入一條記錄,如果它小於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"(); 

通過該功能觸發如預期,因爲我已經硬編碼的主鍵值已經奏效。 但是當我修改觸發函數內部的SQL像下面

INSERT INTO 「結果」 SELECT NEW.ID, '失敗';(或) INSERT INTO「Result」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; – 2012-02-21 11:40:29

+0

嗨米倫,是的,它是在大寫字母,加入引用它的工作後,你可以請簡要說明爲什麼我們需要這樣做 – Murugesh 2012-02-21 12:12:20

+0

[標識符和關鍵詞](http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html#SQL-SYNTAX-IDENTIFIERS),查找「帶引號的標識符」。 – 2012-02-21 13:29:51

回答

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();