Невозможно получить доступ к значению первичного ключа в функции запуска PostgreSQL - PullRequest
1 голос
/ 21 февраля 2012

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

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

INSERT INTO "Result" SELECT NEW.ID, 'fail'; (или) INSERT INTO "Result" SELECT NEW.ID, 'pass';

Выдает ошибку типа

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

Значитон может принимать значения значений не первичного ключа из переменной NEW, а не значение первичного ключа.Может ли кто-нибудь сказать мне, пожалуйста, есть ли ограничение в PL / pgSQL или я делаю что-то не так?

1 Ответ

1 голос
/ 04 июня 2012

Просто подсказка: почему вы используете цитируемые имена?При этом вам нужно заботиться о капитализации.

Проверьте, работает ли это:

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