2012-02-21 3 views
1

Я только начал писать функцию триггера PL/pgSQL. У меня есть пара таблиц «Студент и результат». Студент, имеющий следующие столбцы. ID, название, предмет, знак (ID является первичным ключом) и таблица результатов имеет две колонки, как ID, СтатусНе удалось получить доступ к значению первичного ключа в функции запуска PostgreSQL

Всякий раз, когда одна запись добавлена ​​в таблицу студента, я хочу чтобы обновить таблицу результатов, проверив метку в таблице «Студент». Если введенный знак больше 50, то в таблицу результатов с идентификатором и статусом = Pass должна быть вставлена ​​одна запись, а если она меньше 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 внутри функции Trigger как следующий

INSERT INTO "Результат" SELECT NEW.ID, 'провал'; (или) 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 «Результат "SELECT NEW." ID ", NEW.name; –

+0

Привет, Милен. Да, это заглавная буква, после добавления цитат, в которых она работает. Не могли бы вы рассказать мне, зачем нам это делать? – Murugesh

+0

[Идентификаторы и ключевые слова] (http://www.postgresql.org/docs/ current/static/sql-syntax-lexical.html # SQL-SYNTAX-IDENTIFIERS), найдите «цитируемый идентификатор». –

ответ

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